概述:Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出。管道通过减少客户端与Redis的通信次数来实现降低往返时延累计值的目的
例子
读取数据流程
(1) 客户程序从Redis读取数据,如果读取到则返回
(2) 如果没有读取到,则从数据库抓取数据
(3) 从数据库抓取到的数据存储到Redis
写入数据流程
(1) 客户程序将数据写入Redis
(2) 将数据写入数据库
特点:
1、适用于批处理。当有大量的操作需要一次性执行的时候,可以用管道。
Java使用Pipeline对Redis批量读写,
一次请求,返回多条记录。
优点:
节省在网络延迟的时间:通过pipeline方式当有大批量的操作时候,我们可以节省很多原来浪费在网络延迟的时间,使用Pipeline在对Redis批量读写的时候,性能上有非常大的提升。
缺点:
1、打包的命令不易过多,消耗内存:需要注意到是用pipeline方式打包命令发 送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好
2、Pipeline是责任链模式,模式的缺点是,每次它对于一个输入(或者一次请求)都必须从链头开始遍历(参考Http Server处理请求就能明白),这确实存在一定的性能损耗。
基础方法:
实例Pipeline 对象
jr = new Jedis("10.10.224.44", 6379);
Pipeline pipeline= jr.pipelined();
pipeline.incr("testKey2"); 返回ID值
pipeline.set("p" + i, "p" + i);
pipeline.setex(keyString, time, json); 设置请求信息
pipeline.zadd(keyString, dPrice, json); 向原有的set集合追加对象
pipeline.expire(keyString, time); 执行的有效时间
pipeline.zrem(key, member); 删除redis数据
pipeline.publish(keyString, json); 把请求发送出去
pipeline.sync(); 和publish同时使用,获取所有的响应