jedis pipline 性能测试

pipline模式

Pipeline:“管道”,和很多设计模式中的“管道”具有同样的概念,pipleline的操作,将明确client与server端的交互,都是“单向的”:你可以将多个command,依次发给server,但在此期间,你将无法获得单个command的响应数据,此后你可以关闭“请求”,然后依次获取每个command的响应结果。
从简单来说,在IO操作层面,对于client而言,就是一次批量的连续的“write”请求,然后是批量的连续的“read”操作。其实对于底层Socket-IO而言,对于client而言,只不过是多次write,然后一次read的操作;对于server端,input通道上read到数据之后,就会立即被实施,也会和非pipeline一样在output通道上输出执行的结果,只不过此时数据会被阻塞在网络缓冲区上,直到client端开始read或者关闭链接。神秘的面纱已被解开,或许你也能创造一个pipeline的实现。
非pipleline模式:
Request——>执行
——>Response
Request——>执行
——>Response
Pipeline模式下:
Request——>执行,Server将响应结果队列化
Request——>执行,Server将响应结果队列化
——>Response
——>Response
Client端根据Redis的数据协议,将响应结果进行解析,并将结果做类似于“队列化”的操作。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* 测试redis的效率
* Created by xuyifei01 on 2015/4/14.
*/

public class TestPipeline {

/**
* @param args
*/


ShardedJedis jedis;

// Number of iterations
// Use 1000 to test with the pipeline, 100 otherwise
static final int N = 1000;
static final String rangename = "taojiaen";
static final String field = "dashen";

public TestPipeline() {
JedisShardInfo si = new JedisShardInfo("ip", "port");
si.setPassword("passwd");
List<JedisShardInfo> list = new ArrayList<>();
list.add(si);
jedis = new ShardedJedis(list);
}

public void push(int n) {
ShardedJedisPipeline pipeline = jedis.pipelined();
for ( int k = 0; k < n; k++) {
pipeline.hincrBy(rangename,field,5);
}
pipeline.sync();
}

public void push2( int n ) {
for ( int k = 0; k < n; k++) {
jedis.hincrBy(rangename,field,5);
}
}

public static void main(String[] args) {
TestPipeline obj = new TestPipeline();
long startTime = System.currentTimeMillis();
for ( int j=0; j<N; j++ ) {
obj.push2(1000);
//pipline方式
//obj.push(1000);
}
long endTime = System.currentTimeMillis();
double d = (double)(endTime - startTime);
System.out.println("总共用时: "+d);
}
}

测试结果

总共100w的数据,使用了redis中的hash操作。
其中push方法pipline 实际用时: 66135ms
push2方法jedis方式实际用时N分钟(N>30),并且很耗CPU与内存

结论

pipline作为一种异步方式,执行效率非常高。

参考链接:

http://stackoverflow.com/questions/16697389/why-it-is-so-slow-with-100-000-records-when-using-pipeline-in-redis
http://blog.csdn.net/jiangguilong2000/article/details/9356229