Redis Pipelining 使用

作者:Rui 发布时间:June 7, 2016 分类:JAVA,Redis,BIGDATA 浏览:612

Redis Pipelining 可以让客户端将多个命令一起发送给服务端顺序执行,而不是像之前每个命令,都请求一次服务端。这样可以减少网络往返的时间(RTT),适于用对Redis server有大批量的操作场景。

Redis Server在接收到客户发送来的命令列表后,会按顺序执行这些命令,然后将每个命令的执行结果缓存到一个临时队列中,当所有的命令执行完成,就会将所有结果发送给客户端。所以在使用Pipelining时,会有额外的内存占用。所以如果你有大量的命令执行时,每次批处理的命令个数也不要非常大,可以分批次的发送命令,例如:先发送10K的命令,执行完成后,在发送另外10K的命令。

Redis Pipelining 一般用来处理到大批量数据导入和导出数据的操作,以下使用示例:

JedisShardInfo shardInfo = new JedisShardInfo("kevincache.redis.cache.chinacloudapi.cn", 6379);
Jedis jedis = new Jedis(shardInfo);

long begin = System.currentTimeMillis();
for(int i = 0; i < 50000; i++) {
    jedis.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
}
long end = System.currentTimeMillis();
System.out.println("5W sets without pipelining,using time " + (end-begin)/1000 + " sec");

Pipeline pipeline = jedis.pipelined();
begin = System.currentTimeMillis();
for(int i = 0; i < 50000; i++) {
    pipeline.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
}
pipeline.sync();
end = System.currentTimeMillis();
System.out.println("5W sets with pipelining,using time " + (end-begin)/1000 + " sec");

jedis.close();

本示例使用Azure Redis测试Pipeline效率,5W次set操作
不使用Pipeline,总共花费大概230 sec,平均每次请求花费4.6ms
使用Pipeline,单次请求5W次set操作,花费 10 sec

Redis Pipelining VS Scripting
redis在2.6版本后添加了Scripting功能,可以在redis server添加脚本,类似数据库的存储过程,大部分Pipeline的使用场景,都可以使用Scripting替换,而且这样就能最大化减少redis的延迟,使查询,写入,计算更加高效。

标签: none

添加新评论 »