HTTP Header ETag

HTTP Header ETag HTTP Header中的ETag 分类: java web2013-09-02 20:14 1375人阅读 评论(0) 收藏 举报 目录? 原文参考百度百科: http://baike.baidu.com/view/3039264.htm 概念 Etag[1] 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。 HTTP协议规格说明定义ETag为"被请求变量的实体值"。另一种说法是,ETag是一个可以与Web资源关联的记号 (token) 。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式: ETag:“50b1c1d4f775c61:df3"客户端的查询更新格式是这样的: If-None-Match : W / “50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。 性能 聪明的服务器开发者会把ETags和GET请求的"If-None-Match"头一起使用,这样可利用客户端 (例如浏览器) 的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其 (客户端) 缓存。 其过程如下: 客户端请求一个页面 (A) 。 服务器返回页面A,并在给A加上一个ETag。 客户端展现该页面,并将页面连同ETag一起缓存。 客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。 服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304 (未修改——Not Modified) 和一个空的响应体。 优势 有些URL是多语言的网页,相同的URL会返回不同的东西。还有不同的Session有不同的Cookie也就有不同的内容。这种情况下如果过 Proxy,Proxy就无法区分导致串门,只能简单的取消cache功能。Etag解决了这个问题,因为它能区分相同URL不同的对象。 老的HTTP标准里有个Last-Modified+If-Modified-Since表明URL对象是否改变。Etag也具有这种功能,因为对象改变也造成Etag改变,并且它的控制更加准确。Etag有两种用法 If-Match/If-None-Match,就是如果服务器的对象和客户端的对象ID (不) 匹配才执行。这里的If-Match/If-None- Match都能一次提交多个Etag。If-Match可以在Etag未改变时断线重传。If-None-Match可以刷新对象 (在有新的Etag时返回) 。 Etag中有种Weak Tag,值为 W/“xxxxx”。他声明Tag是弱匹配的,只能做模糊匹配,在差异达到一定阀值时才起作用。 Etag对于cache CGI页面很有用。特别是论坛,论坛有办法为每个帖子页面生成唯一的Etag,在帖子未改变时,查看话题属性比较Etag就能避免刷新帖子,减少CGI操作和网络传输。比如论坛中看帖就返回Etag,减少论坛负担。 Etag在不同URL之间没有可比性,也就是不同URL相同Etag没有特别意义。 原理 请求流程 Etag由服务器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个文件的流程可能如下: ====第一次请求=== 1.客户端发起 HTTP GET 请求一个文件; 2.服务器处理请求,返回文件内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840”)(假设服务器支持Etag生成和已经开启了Etag).状态码200 ====第二次请求=== ...

2015-09-07 · 1 min · 108 words · -

chrome sdch

chrome sdch sdch: chrome 支持的新HTTP传输压缩算法 我们知道,为了加快网络传输,一般都使用gzip对文本进行压缩。如果你现在用最新版的chrome去访问页面,然后打开network控制面板,查看http headers,细心的你会发现在Request Headers里的Accept-Encoding不再是gzip,deflate,而是多了个sdch,变成了gzip,deflate,sdch。如图: SDCH到底是什么 sdch是Shared Dictionary Compression over HTTP的缩写,即通过字典压缩算法对各个页面中相同的内容进行压缩,减少相同的内容的传输。如: 一个网站中一般都是共同的头部和尾部,甚至一些侧边栏也是共同的。之前的方式每个页面打开的时候这些共同的信息都要重新加载,但使用SDCH压缩方式的话,那些共同的内容只用传输一次就可以了。 sdch主要分为3个部分: 首次请求,下载字典,之后的请求。 这种方式最开始的时候是Google工具栏里为IE准备的,目前Chrome已经完全支持了,不过暂时还没发现哪个网站在使用。 SDCH与ajax+pushState SDCH压缩方式是为了减少相同内容的传输的,同时之前介绍的ajax+pushState也是减少相同内容的传输,他们想达到的效果是一样的。只是SDCH是Google出的,可能今后一段时间只有Chrome浏览器支持,但pushState是HTML5的一个标准,目前已经有Chrome和Firefox支持,之后会有越来越多的浏览器支持。 个人觉得SDCH可能没有什么太大的发展,但可以作为一个新方向研究,并且在合适的时候添加到标准里,让网络传输越来越迅速。

2015-09-06 · 1 min · 21 words · -

Linux单机TCP并发连接

Linux单机 TCP 并发连接 http://blog.csdn.net/kobejayandy/article/details/47127991 总结下服务端对于tcp连接的限制与提高tcp连接数的方法,可能工作中永远不会用到,但对于网络知识理解会有帮助。1.服务端与16位的端口号 (最大65535) 没什么关系 服务端ip+port(监听端口) + 客户端ip+port 决定了一条连接,客户端连接服务器后,服务端并没有又分配一个物理端口与客户端连接。其实所有的数据还是通过监听端口接收与发送的 (不论全双工与半双工,反正都是双工的) ,只不过多了一个逻辑上的socket。这些都应该是网卡上的事情,当接收到一个字节流的时候,网卡就会回调给操作系统,回调的时候会告诉操作系统客户端ip+port,假如是epoll模型,那么这次可能只接收了几个字节,回调那个新的socket的特定方法。然后下一次从监听端口回调上来的数据可能是另外的一个逻辑上的socket,各自互不影响。 2.内存限制 系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB)。一个tcb控制块大概要占用1k多的内存,假如百万连接,1个tcb占用1k内存,那么就需要1G的内存了,这还是理想情况,一般情况下tcb要大于1k内存。当每个连接上在有数据传输的时候,同时需要的内存就更大了。 另外需要设置的tcp参数有tcp的读写缓冲区,默认为86k,都可以改成4k。此外需要修改tcp_mem的值。 tcp_mem(3个INTEGER变量): low, pressure, high low: 当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。 pressure: 当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。 high: 允许所有tcp sockets用于排队缓冲数据报的页面量,当内存占用超过此值,系统拒绝分配socket,后台日志输出"TCP: too many of orphaned sockets"。 3.文件句柄限制 每个socket都是一个文件句柄,linux下文件句柄限制,包括linux允许的最大文件句柄,linux允许的最大同时活动的文件句柄。 4.网卡限制 千兆网卡,上限满负荷工作,大概有600兆左右,单位为b,除以8为75k/单个连接。这个一般可以满足。 参考http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html linux下需要修改的地方有: echo “* - nofile 1048576” » /etc/security/limits.conf #open file resource limit 是linux中process可以打开的文件句柄数量。 echo “fs.file-max = 1048576” » /etc/sysctl.conf #系统最大允许的文件描述符 echo “net.ipv4.ip_local_port_range = 1024 65535” » /etc/sysctl.conf #可以使用的端口范围,主要为了测试时候使用 ...

2015-08-31 · 1 min · 100 words · -

Java NIO 框架 Netty, Mina, Grizzly

Java NIO 框架 Netty, Mina, Grizzly Netty Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP socket 服务器。 Mina Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。目前,正在使用 Mina的应用包括: Apache Directory Project、AsyncWeb、AMQP (Advanced Message Queuing Protocol) 、RED5 Server (Macromedia Flash Media RTMP) 、ObjectRADIUS、 Openfire等等。 Grizzly: Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API。带来非阻塞socketd到协议处理层。利用高性能的缓冲和缓冲管理使用高性能的线程池。 OK,我们现在可以看看三者的简单对比了。 首先,从设计的理念上来看,Mina的设计理念是最为优雅的。当然,由于Netty的主导作者与Mina的主导作者是同一人,出自同一人之手的Netty在设计理念上与Mina基本上是一致的。而Grizzly在设计理念上就较差了点,几乎是Java NIO的简单封装。 其次,从项目的出身来看,Mina出身于开源界的大牛Apache组织,Netty出身于商业开源大亨Jboss,而Grizzly则出身于土鳖Sun公司。从其出身可以看到其应用的广泛程序,到目前为止,我见到业界还是使用Mina多一些,而Netty也在慢慢的应用起来,而Grizzly则似乎只有Sun自已的项目使用了,如果还有其他的公司或开源项目在使用,那就算我孤陋寡闻。 最后,从入门的文档来说,由于Mina见世时间相对较长,官方以及民间的文档与入门示例都相当的多。Netty的官方文档也做得很好,而民间文档就要相对于Mina少一些了。至于Grizzly,不管是官方还是民间,都很少见到其文档。 http://www.blogjava.net/javagrass/archive/2011/07/05/353680.html

2015-08-31 · 1 min · 52 words · -

Dubbo

Dubbo Dubbo, |ˈdʌbəʊ| Dubbo3 推荐使用 IDL 定义跨语言服务 Dubbo 默认的协议是 dubbo 协议 (协议和框架同名),而 dubbo 协议默认指定的序列化方式是 hessian2 IDL 接口描述语言 (Interface description language,缩写IDL) helloworld https://github.com/dubbogo/dubbo-samples.git export CONF_PROVIDER_FILE_PATH="/home/wiloon/tmp/server.yml" export CONF_CONSUMER_FILE_PATH="/home/wiloon/tmp/client.yml" export APP_LOG_CONF_FILE="/home/wiloon/tmp/log.yml" 服务发现 流式通信 负载均衡 流量调度/流量治理 Dubbo 支持流控策略在运行态动态生效,无需重新部署。 Apache Dubbo 是一款微服务开发框架, 致力于提供高性能和透明化的RPC远程服务调用方案, 以及SOA服务治理方案, 使得应用可通过高性能RPC实现服务的输出和输入功能, 和Spring框架可以无缝集成。 作为一个分布式服务框架,以及SOA治理方案,Dubbo其功能主要包括: 高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与服务降级等。Dubbo最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 (或者最大限度地松耦合) 。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方 (Provider) 和服务消费方 (Consumer) 两个角色。 Dubbo包含远程通讯、集群容错和自动发现三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 下图来自Dubbo官网,描述了服务注册中心、服务提供方、服务消费方、服务监控中心之间的调用关系,具体如下图所示: 调用关系说明: 服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。 Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。 下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点: 服务接口层 (Service) : 该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。 配置层 (Config) : 对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类。 ...

2015-08-28 · 1 min · 203 words · -

Spark

Spark http://www.cnblogs.com/jerrylead/archive/2012/08/13/2636115.html 摘要: Spark是继Hadoop之后的新一代大数据分布式处理框架,由UC Berkeley的Matei Zaharia主导开发。我只能说是神一样的人物造就的神器,详情请猛击http://www.spark-project.org/ Created 2012-05-09 Modified 2012-08-13 1 Scala安装 当前,Spark最新版本是0.5,由于我写这篇文档时,版本还是0.4,因此本文下面的所有描述基于0.4版本。 不过淘宝的达人已经尝试了0.5,并写了相关安装文档在此http://rdc.taobao.com/team/jm/archives/tag/spark。 我使用的Spark的版本是0.4,只存在于github上,该版本使用的Scala版本是0.9.1.final。所以先到http://www.scala-lang.org/node/165下载scala-2.9.1.final.tar.gz。解压后放到本地 /opt 下面,在 /etc/profile 里添加 export SCALA_HOME=/opt/scala-2.9.1.final export PATH=$SCALA_HOME/bin:$PATH 2 git安装 由于下载Spark和编译Spark需要git,因此先安装git,安装方法可以到Ubuntu软件中心直接装,也可以apt-get装。装好后需要到https://github.com 去注册一个帐号,我注册的是JerryLead,注册邮箱和密码,然后根据网站上的get-start提示生成RSA密码。 注意: 如果本地之前存在rsa_id.pub,authorized_keys等,将其保存或着将原来的密码生成为dsa形式,这样git和原来的密码都不冲突。 3 Spark安装 首先下载最新的源代码 git clone git://github.com/mesos/spark.git 得到目录spark后,进入spark目录,进入conf子目录,将 spark-env.sh-template 重命名为spark-env.sh,并添加以下代码行: export SCALA_HOME=/opt/scala-2.9.1.final 回到spark目录,开始编译,运行 $ sbt/sbt update compile 这条命令会联网下载很多jar,然后会对spark进行编译,编译完成会提示success [success] Total time: 1228 s, completed May 9, 2012 3:42:11 PM 可以通过运行spark-shell来和spark进行交互。 也可以先运行测试用例./run <class> <params> ./run spark.examples.SparkLR local[2] 在本地启动两个线程运行线性回归。 ./run spark.examples.SparkPi local 在本地启动运行Pi估计器。 更多的例子在examples/src/main/scala里面 3 Spark导出 在使用Spark之前,先将编译好的classes导出为jar比较好,可以 $ sbt/sbt assembly 将Spark及其依赖包导出为jar,放在 core/target/spark-core-assembly-0.4-SNAPSHOT.jar 可以将该jar添加到CLASSPATH里,开发Spark应用了。 一般在开发Spark应用时需要导入Spark一些类和一些隐式的转换,需要再程序开头加入 import spark.SparkContext import SparkContext._ 4 使用Spark交互模式 1. 运行./spark-shell.sh 2. scala> val data = Array(1, 2, 3, 4, 5) //产生data data: Array[Int] = Array(1, 2, 3, 4, 5) 3. scala> val distData = sc.parallelize(data) //将data处理成RDD distData: spark.RDD[Int] = spark.ParallelCollection@7a0ec850 (显示出的类型为RDD) 4. scala> distData.reduce(_+_) //在RDD上进行运算,对data里面元素进行加和 12/05/10 09:36:20 INFO spark.SparkContext: Starting job... 5. 最后运行得到 12/05/10 09:36:20 INFO spark.SparkContext: Job finished in 0.076729174 s res2: Int = 15 5 使用Spark处理Hadoop Datasets Spark可以从HDFS/local FS/Amazon S3/Hypertable/HBase等创建分布式数据集。Spark支持text files,SequenceFiles和其他Hadoop InputFormat。 比如从HDFS上读取文本创建RDD scala> val distFile = sc.textFile("hdfs://m120:9000/user/LijieXu/Demo/file01.txt") 12/05/10 09:49:01 INFO mapred.FileInputFormat: Total input paths to process : 1 distFile: spark.RDD[String] = spark.MappedRDD@59bf8a16 然后可以统计该文本的字符数,map负责处理文本每一行map(_size)得到每一行的字符数,多行组成一个List,reduce负责将List中的所有元素相加。 scala> distFile.map(_.size).reduce(_+_) 12/05/10 09:50:02 INFO spark.SparkContext: Job finished in 0.139610772 s res3: Int = 79 textFile可以通过设置第二个参数来指定slice个数 (slice与Hadoop里的split/block概念对应,一个task处理一个slice) 。Spark默认将Hadoop上一个block对应为一个slice,但可以调大slice的个数,但不能比block的个数小,这就需要知道HDFS上一个文件的block数目,可以通过50070的dfs的jsp来查看。 对于SequenceFile,可以使用SparkContext的sequenceFile[K,V]方法生成RDD,其中K和V肯定要是SequenceFile存放时的类型了,也就是必须是Writable的子类。Spark也允许使用native types去读取,如sequenceFile[Int, String]。 对于复杂的SequenceFile,可以使用SparkContext.hadoopRDD方法去读取,该方法传入JobConf参数,包含InputFormat,key class,value class等,与Hadoop Java客户端读取方式一样。 6 分布式数据集操作 分布式数据集支持两种类型的操作: transformation和action。transformation的意思是从老数据集中生成新的数据集,action是在数据集上进行计算并将结果返回给driver program。每一个Spark应用包含一个driver program用来执行用户的main函数,比如,map就是一个transformation,将大数据集划分处理为小数据集,reduce是action,将数据集上内容进行聚合并返回给driver program。有个例外是reduceByKey应该属于transformation,返回的是分布式数据集。 需要注意的是,Spark的transformation是lazy的,transformation先将操作记录下来,直到接下来的action需要将处理结果返回给driver program的时候。 另一个特性是caching,如果用户指定cache一个数据集RDD,那么该数据集中的不同slice会按照partition被存放到相应不同节点的内存中,这样重用该数据集的时候,效率会高很多,尤其适用于迭代型和交互式的应用。如果cache的RDD丢失,那么重新使用transformation生成。 7 共享变量 与Hadoop的MapReduce不同的是,Spark允许共享变量,但只允许两种受限的变量: broadcast和accumulators。 Broadcast顾名思义是"广播",在每个节点上保持一份read-only的变量。比如,Hadoop的map task需要一部只读词典来处理文本时,由于不存在共享变量,每个task都需要加载一部词典。当然也可以使用DistributedCache来解决。在Spark中,通过broadcast,每个节点存放一部词典就够了,这样从task粒度上升到node粒度,节约的资源可想而知。Spark的broadcast路由算法也考虑到了通信开销。 通过使用SparkContext.broadcast(v)来实现对变量v的包装和共享。

2015-08-28 · 2 min · 216 words · -

Disruptor

Disruptor http://www.cnblogs.com/killmyday/archive/2012/12/02/2798218.html http://www.cnblogs.com/haiq/p/4112689.html 票池暂定使用disruptor来做消息队列,把最近对disruptor的调研结果整理一下。大部分文字都是把disruptor和其它网站上看到的资料翻译一下。 原文: http://www.oraclejavamagazine-digital.com/javamagazine/20120304/?pg=56&pm=1&u1=friend#pg56 Disruptor是什么? Disruptor是一个线程间通信的框架,即在多线程间共享数据。它是由LMAX公司开发的可信消息传递架构的一部分,以便用非常快速的方法来在多组件之间传递数据。它的一个核心思想是理解并适应硬件工作方式来达到最优的效果。 在很多 (并行) 架构里,普遍使用队列来共享数据 (例如传递消息) 。图1就是使用队列来传递消息的一个示意图 (里面蓝色的小圈圈表示一个线程) 。这种架构允许生产线程 (图1里的stage1) 在消费线程 (图1里的stage2) 处理不过来的情况下,还可以继续后面的工作,队列在其中用来做为消息的缓冲区。 图1 在最简单的情况下,disruptor可以用来替代图1架构里的队列,也就是线程间通过disruptor来传递数据。在disruptor里保存消息的数据结构是环状缓冲区 (RingBuffer - 后面都用RingBuffer这个术语) 。生产线程stage1将消息放到 RingBuffer 里,然后消费线程stage2从 RingBuffer里读取消息,如图2。 图2 从图2里可以看到,RingBuffer 里的每一个元素都有一个序列号 (sequence number) 来索引,RingBuffer维护当前最新放置的元素的序列号,这个序列号一直递增, (通过求余来得到元素在RingBuffer下面的数组下标) 。 Disruptor的关键特性是无锁编程,这个是通过单一写线程的方式实现的 - 即一块数据永远只有一个线程写入。通过遵循这个编程原则来避免使用昂贵的同步锁或CAS操作,这就是为什么Disruptor这么快的原因。 因为RingBuffer规避了锁,而且每个EventProcessor维护自己的序列号。 向Disruptor发布消息 往RingBuffer里写入消息使用两步提交的方式。首先,生产线程Stage1需要确定RingBuffer里下一个空闲槽,如图3。 图3 RingBuffer维护了最后一次写入的序列号 (图3里的18号) ,因此就可以推知下一个空闲的槽号。RingBuffer通过检查所有从RingBuffer读取消息的EventProcessor的序列号,以判别下一个槽号是否空闲。 图4演示了索取下一个空闲槽序列号的过程。 图4 当生产线程拿到了下一个序利号之后,它从RingBuffer里拿到槽里保存的对象并执行任何操作。这个过程中,因为RingBuffer的最新序列号依然是18,因此其它线程无法读取19号槽里面的事件 - 生产线程还在处理它。 图5 图5演示了RingBuffer在提交变更后的情况。当生产线程处理完第19号槽的数据后,它告诉RingBuffer将其公布出来。这个时候,RingBuffer才会更新它维护的序列号,任何等待读取第19号槽里的数据的线程才能读取它。 从RingBuffer里读取信息 Disruptor框架里提供了一个叫做BatchEventProcessor来从RingBuffer里读取数据。当生产线程向RingBuffer要求下一个可写入的空闲槽的序列号时,同时一个EventProcessor (类似消费者,但其并消费RingBuffer里的元素 - 即不从RingBuffer里移除任何元素) 也会维护其最后所处理的数据的序列号,并要求下一个可处理的数据的序列号。 图6演示了EventProcessor等待处理下一个可读取数据序利号的过程。 图6 EventProcessor不是直接从RingBuffer里获取下一个可读取数据的序列号,而是通过一个SequenceBarrier对象来做的,稍后我们谈这个细节。 图6里,EventProcessor (即消费者线程Stage2) 最后看到的是第16号槽的数据,它希望处理下一个 (第17号) 槽的数据,因此它执行SequenceBarrier的waitFor(17)函数调用。线程Stage2可以一直等待下一个可读序列号,因为如果尚没有数据生产出来的话,它什么也不需要做。但跟图6所示的一样,RingBuffer里最新可用数据已经到18号槽了,因此waitFor返回18,即告诉EventProcessor可以一直读到第18号的所有数据。如图7。 图7 这种模式提供了很好的批处理行为,可以使用这种批处理代码来实现EventHandler,在Disruptor里性能测试FizzBuzzEventHandler就是一个很好的例子。 处理系统组件之间的依赖关系 Disruptor处理系统内部多组件的依赖关系,而不引入任何线程竞争的做法很有意思。Disruptor遵循的是单线程写入,多线程读取的做法。Disruptor的原始设计是支持几步具有特定顺序的串行流水线操作 - 这种操作在企业级的系统里很常见。图8演了一个标准的三步流水线操作: ...

2015-08-28 · 1 min · 107 words · -

进程间通信IPC、LPC、RPC

进程间通信IPC、LPC、RPC 进程间通信 IPC、LPC、RPC http://www.cnblogs.com/gsk99/archive/2010/12/13/1904541.html 进程间通信 (IPC,Inter-Process Communication) , 指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一计算机上或网络连接的不同计算机上。 进程间通信技术包括消息传递、同步、共享内存和远程过程调用。 IPC是一种标准的Unix通信机制。 有两种类型的进程间通信(IPC)。 本地过程调用(LPC)LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。 远程过程调用(RPC)RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNIX操作系统的计算机中。 通过IPC和RPC,程序能利用其它程序或计算机处理的进程。客户机/服务器模式计算把远程过程调用与其它技术如消息传递一道,作为系统间通信的一种机制。客户机执行自己的任务,但靠服务器提供后端文件服务。RPC为客户机提供向后端服务器申请服务的通信机制。如果你把客户机/服务器应用程序想作是一个分离的程序,服务器能运行数据访问部分,因为它离数据最近,客户机能运行数据表 示和与用户交互的前端部分。这样,远程过程调用可看作是把分割的程序通过网络重组的部件。LPC有时也称耦合(Coupling)机制。 用这种方式分割程序,当用户要访问数据时就无需每次拷贝整个数据库或它的大部分程序到用户系统。其实,服务器只处理请求,甚至只执行一些数据计算,把得出的结果再发送给用户。因为当数据存放在一个地方时,数据库同步很容易实现,所以多个用户可同时访问相同的数据。 RPC: Remote procedure call (RPC) is an Inter-process communication technology that allows a computer program to cause a subroutine or procedure to execute in another address space (commonly on another computer on a shared network) without the programmer explicitly coding the details for this remote interaction. IPC: Inter-process communication (IPC) is a set of techniques for the exchange of data among multiple threads in one or more processes. Processes may be running on one or more computers connected by a network. ...

2015-08-28 · 1 min · 108 words · -

Java Unix Socket

Java Unix Socket http://www.oschina.net/p/juds/similar_projects?lang=0&sort=view Java Unix Domain Sockets (JUDS) 提供了 Java 的方法用来访问 Unix domain sockets socket 。 示例代码: package com.google.code.juds.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import com.google.code.juds.*; public class TestUnixDomainSocket { public static void main(String[] args) throws IOException { if (args.length != 1) { System.out .println("usage: java TestUnixDomainSocket socketfilename"); System.exit(1); } String socketFile = args[0]; byte[] b = new byte[128]; // Testcase 1.1: Test UnixDomainSocketClient with a stream socket UnixDomainSocketClient socket = new UnixDomainSocketClient(socketFile, UnixDomainSocket.SOCK_STREAM); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); in.read(b); System.out.println("Text received: \"" + new String(b) + "\""); String text = "[2] Hello! I'm the client!"; out.write(text.getBytes()); System.out.println("Text sent: " + "\"" + text + "\""); socket.close(); // Testcase 1.2: Test UnixDomainSocketClient with a datagram socket socket = new UnixDomainSocketClient(socketFile, UnixDomainSocket.SOCK_DGRAM); System.out.println("Provoke and catch an " + "UnsupportedOperationException:"); try { in = socket.getInputStream(); } catch (UnsupportedOperationException e) { System.out.println("UnsupportedOperationException has been " + "thrown as expected."); } out = socket.getOutputStream(); text = "[3] Hello! I'm the client!"; out.write(text.getBytes()); System.out.println("Text sent: \"" + text + "\""); socket.close(); // Testcase 2.1: Test UnixDomainSocketServer with a stream socket System.out.println("\nTest #2: Test UnixDomainSocketServer\nTestcase " + "2.1: Test UnixDomainSocketServer with a stream socket..."); UnixDomainSocketServer ssocket = new UnixDomainSocketServer(socketFile, UnixDomainSocket.SOCK_STREAM); in = ssocket.getInputStream(); out = ssocket.getOutputStream(); in.read(b); System.out.println("Text received: \"" + new String(b) + "\""); text = "[5] Hello! I'm the server!"; out.write(text.getBytes()); System.out.println("Text sent: " + "\"" + text + "\""); ssocket.close(); ssocket.unlink(); // Testcase 2.2: Test UnixDomainSocketServer with a datagram socket System.out.println("Testcase 2.2: Test UnixDomainSocketServer with " + "a datagram socket..."); ssocket = new UnixDomainSocketServer(socketFile, UnixDomainSocket.SOCK_DGRAM); System.out.println("Provoke and catch an " + "UnsupportedOperationException:"); in = ssocket.getInputStream(); try { out = ssocket.getOutputStream(); } catch (UnsupportedOperationException e) { System.out.println("UnsupportedOperationException has been " + "thrown as expected."); } in.read(b); System.out.println("Text received: \"" + new String(b) + "\""); ssocket.close(); ssocket.unlink(); } }

2015-08-26 · 2 min · 299 words · -

unix domain socket, UDS

unix domain socket, UDS ss -nxp ss -nxlp http://blog.csdn.net/bingqingsuimeng/article/details/8470029 http://blog.chinaunix.net/uid-20511624-id-1659107.html 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程式员能够用他们来研发TCP/IP网络上的应用程式。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。假如了解 Unix 系统的输入和输出的话,就很容易了解 Socket 了。网络的 Socket数据传输是一种特别的I/O,Socket也是一种文档描述符。Socket也具备一个类似于打开文档的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种: 流式Socket (SOCK_STREAM) 和数据报式Socket (SOCK_DGRAM) 。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket 建立 为了建立Socket,程式能够调用Socket函数,该函数返回一个类似于文档描述符的句柄。socket函数原型为: int socket(int domain, int type, int protocol); domain指明所使用的协议族,通常为PF_INET,表示互连网协议族 (TCP/IP协议族) ;type参数指定socket的类型: SOCK_STREAM 或SOCK_DGRAM,Socket接口还定义了原始Socket (SOCK_RAW) ,允许程式使用低层协议;protocol通常赋值"0"。 Socket()调用返回一个整型socket描述符,您能够在后面的调用使用他。 Socket描述符是个指向内部数据结构的指针,他指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为您管理描述符表。 两个网络程式之间的一个网络连接包括五种信息: 通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。 Socket配置 通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端连同面向连接socket的服务端通过调用 bind函数来配置本地信息。 Bind函数将socket和本机上的一个端口相关联,随后您就能够在该端口监听服务请求。Bind函数原型为: int bind(int sockfd,struct sockaddr *my_addr, int addrlen); Sockfd是调用socket函数返回的socket描述符,my_addr是个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被配置为sizeof(struct sockaddr)。 struct sockaddr结构类型是用来保存socket信息的: struct sockaddr { unsigned short sa_family; /地址族, AF_xxx/ char sa_data[14]; /14 字节的协议地址/ ...

2015-08-26 · 6 min · 1223 words · -

maven Scope

maven Scope maven依赖关系中Scope的作用 Dependency Scope 在POM 4中,中还引入了,它主要管理依赖的部署。目前可以使用5个值: compile,缺省值,适用于所有阶段,会随着项目一起发布。 provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

2015-08-24 · 1 min · 12 words · -

Maven jar plugin

Maven jar plugin 1.修改pom.xml增加如下内容 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <manifest> true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.sysware.HelloWorld</mainClass> </manifest> </archive> </configuration> </plugin> 运行mvn clean package即可 html …src/main/java src/main/resources ...

2015-08-24 · 1 min · 81 words · -

java ssh

java ssh http://www.rigongyizu.com/java-ssh-copy-remote-file/ http://www.rigongyizu.com/tag/java/ jsch http://www.jcraft.com/jsch/ http://www.rigongyizu.com/tag/java/ Ganymed SSH-2 for Java http://www.cleondris.ch/opensource/ssh2/ 也是纯java实现了ssh2协议,这个库代码比较老,一直没更新了,只在J2SE 1.4.2 和 5.0上测试过。网上有些例子。 sshj https://github.com/shikhar/sshj API封装的很友好,功能齐全。 sshd http://mina.apache.org/sshd-project/index.html 基于mina,可以同时支持ssh服务端和客户端。

2015-08-14 · 1 min · 22 words · -

语义化版本, semantic versioning

语义化版本, semantic versioning 版本号格式为v<major>.<minor>.<patch>,如v1.2.3。当有不兼容的改变时,需要增加 major 版本号,如v2.1.0。 MAJOR.MINOR.PATCH 版本格式: 主版本号.次版本号.修订号,版本号递增规则如下: 主版本号: 当你做了不兼容的API 修改, 次版本号: 当你做了向下兼容的功能性新增, 修订号: 当你做了向下兼容的问题修正。 先行版本号及版本编译信息可以加到"主版本号.次版本号.修订号"的后面,作为延伸。 semantic versioning https://semver.org/lang/zh-CN/

2015-08-13 · 1 min · 20 words · -

Fastjson

Fastjson // 序列化 String text = JSON.toJSONString(obj); // 反序列化 Map<String, Object> foo = JSON.parseObject(jsonStr0, Map.class); fastjson 对象转换时重命名字段名 @JSONField(name="total_count") private int totalCount; @JSONField(name="incomplete_results") private boolean incompleteResults = false; Map<String, Object> userMap = JSON.parseObject(o, new TypeReference<Map<String, Object»() {}); 使用Fastjson序列化与反序列化对象 public class JSONobject { private String obj; private String color; public String getObj() { return obj; } public void setObj(String obj) { this.obj = obj; } public String getcolor() { return color; } public void setcolor(String color) { this.color = color; } ...

2015-08-13 · 2 min · 325 words · -

Mockito

Mockito 部分mock (partial mock) 部分mock是说一个类的方法有些是实际调用,有些是使用mockito的stubbing (桩实现) 。 为什么需要部分mock 当需要测试一个组合方法 (一个方法需要其它多个方法协作) 的时候,某个叶子方法 (只供别人调用,自己不依赖其它反复) 已经被测试过,我们其实不需要再次测试这个叶子方法,so,让叶子打桩实现返回结果,上层方法实际调用并测试。 mockito实现部分mock的两种方式: spy和 callRealMethod() spy的原理是,如果不打桩默认都会执行真实的方法,如果打桩则返回桩实现。可以看出spy.size()通过桩实现返回了值100,而spy.get(0)则返回了实际值 List<String> list = new LinkedList<String>(); List<String> spy = spy(list); when(spy.size()).thenReturn(100); spy.add("one"); spy.add("two"); assertEquals(spy.get(0), "one"); assertEquals(100, spy.size()); Channel channel = mock(Channel.class); when(channel.writeAndFlush(obj)).thenReturn(null); // 重置 spy 对象,让 add(1,2) 调用真实方法,返回 3 when(exampleService.add(1, 2)).thenCallRealMethod(); Assert.assertEquals(3, exampleService.add(1, 2)); 一、什么是mock测试,什么是mock对象? 一种替代方案就是使用mocks 从图中可以清晰的看出 mock对象就是在调试期间用来作为真实对象的替代品。 mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。 知道什么是mock测试后,那么我们就来认识一下mock框架—Mockito 二、什么是Mockito ...

2015-08-13 · 2 min · 352 words · -

powermock

powermock PowerMock LinkageError: MockClassLoader javax/management/MBeanServer{.question-hyperlink} http://stackoverflow.com/questions/20400574/powermock-linkageerror-mockclassloader-javax-management-mbeanserver @RunWith(PowerMockRunner.class) @PowerMockIgnore({“javax.management.*”}) @PrepareForTest(ClassName.class) http://blog.csdn.net/jackiehff/article/details/14000779

2015-08-12 · 1 min · 10 words · -

MySQL 实现 row_number() over(partition by) 分组排序功能

MySQL 实现 row_number() over(partition by) 分组排序功能 mysql 8 MySQL ROW_NUMBER()从8.0版开始引入了功能。这ROW_NUMBER()是一个窗口函数或分析函数,它为从1开始应用的每一行分配一个序号。 mysql 8 之前的替代方案 SELECT t.*, @rownum := @rownum + 1 AS rank FROM YOUR_TABLE t, (SELECT @rownum := 0) r http://mrcelite.blog.51cto.com/2977858/745913 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mrcelite.blog.51cto.com/2977858/745913 由于MySQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MySQL里需要实现这样的功能,我们只能用一些灵活的办法: 首先我们来创建实例数据: drop table if exists c; CREATE TABLE `heyf_t10` ( `empid` INT(11) NULL DEFAULT NULL, `deptid` INT(11) NULL DEFAULT NULL, `line` DECIMAL(10,2) NULL DEFAULT NULL ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB ; INSERT INTO `heyf_t10` (`empid`, `deptid`, `line`) VALUES (1,10,5500.00), (2,10,4500.00), (3,20,1900.00), (4,20,4800.00), (5,40,6500.00), (6,40,14500.00), (7,40,44500.00), (8,50,6500.00), (9,50,7500.00); 确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次. 显示结果预期如下: +——-+——–+———-+——+ | empid | deptid | line | rank | +——-+——–+———-+——+ | 1 | 10 | 5500.00 | 1 | | 2 | 10 | 4500.00 | 2 | | 3 | 20 | 1900.00 | 1 | | 4 | 20 | 4800.00 | 2 | | 5 | 40 | 6500.00 | 1 | | 6 | 40 | 14500.00 | 2 | | 7 | 40 | 44500.00 | 3 | | 8 | 50 | 6500.00 | 1 | | 9 | 50 | 7500.00 | 2 | +——-+——–+———-+——+ ...

2015-08-06 · 2 min · 394 words · -

MySQL Error 1093 – Can't specify target table for update in FROM clause

MySQL Error 1093 – Can’t specify target table for update in FROM clause http://stackoverflow.com/questions/45494/MySQL-error-1093-cant-specify-target-table-for-update-in-from-clause wrap the condition in one more select DELETE FROM story_category WHERE category_id NOT IN ( SELECT cid FROM ( SELECT DISTINCT category.id AS cid FROM category INNER JOIN story_category ON category_id=category.id ) AS c )```

2015-08-06 · 1 min · 49 words · -

SIM, eSIM

SIM, eSIM 香港手机流量 在支付宝搜索 “境外上网”, 打开境外上网小程序, 选择中国移动, 目的地选择 “中国香港” 选择 “4G 本地” – 使用香港本地 4G 网络, 能访问 Google 下载 “无忧行” APP, 可以查看流量激活情况和剩余流量. 选择套餐: 境外流量包 4G 本地, 5 天15G: 40RMB – 2024-11-09 泰国手机卡 在支付宝 “境外上网” 里选择目的地 泰国, 选择套餐, 点击预订, 等待实体卡邮寄. Happy 卡 7天 15G: 40RMB – 2024-11-09 Textr eSIM 覆盖全球 131 个国家或地区, 支持 eSIM 香港 10G/68.19RMB 泰国 10G/121.69RMB – 2024-11-09 IMSI, IMEI http://cuisuqiang.iteye.com/blog/2067254 IMSIIMEI网络码运营商MNC IMSI是相对手机卡而言的 国际移动用户识别码 (IMSI: International Mobile Subscriber Identification Number) ...

2015-08-05 · 1 min · 158 words · -