Redis是一个响应式的服务,当client发送一个请求后,就处于堵塞状态等待Redis返回结果。

这样一次命令消耗的时间就包含三个部分:请求从client到server的时间、结果从server到client的时间和命令真正运行时间,前两个部分消耗的时间总和称为RTT(Round Trip Time)。当client与server存在网络延时时,RTT就可能会非常大,这样就会导致性能问题。

管道(Pipeline)就是为了改善这个情况的。利用管道,client能够一次性发送多个请求而不用等待server的响应,待全部命令都发送完后再一次性读取服务的响应,这样能够极大的减少RTT时间从而提升性能。

以下这个样例。在本地分别以普通请求和管道对一个键调用2000次incr命令的測试。

public class App
{
public static void main( String[] args ) {
long start = System.currentTimeMillis();
withoutPipeline();
System.out.println("Without Pipeline takes: " + (System.currentTimeMillis() - start) + " ms."); start = System.currentTimeMillis();
withPipeline();
System.out.println("With Pipeline takes: " + (System.currentTimeMillis() - start) + " ms.");
} public static void withPipeline() {
Jedis jedis = null; try {
jedis = new Jedis("localhost", 6379);
jedis.flushDB();
Pipeline p = jedis.pipelined(); p.set("thekey", Integer.toString(0)); for (int i = 1; i <= 2000; i++) {
p.incr("thekey");
} Response<String> r = p.get("thekey"); p.sync(); System.out.println(r.get());
} finally {
jedis.close();
} } public static void withoutPipeline() {
Jedis jedis = null; try {
jedis = new Jedis("localhost", 6379);
jedis.flushDB();
jedis.set("thekey", Integer.toString(0)); for (int i = 1; i <= 2000; i++) {
jedis.incr("thekey");
} System.out.println(jedis.get("thekey"));
} finally {
jedis.close();
} }
} //输出结果
2000
Without Pipeline takes: 183 ms.
2000
With Pipeline takes: 47 ms.

结果非常直观的反映出两者的区别。要知道这是在本地測试,差点儿不存在网络延时的问题。假设是在不同的网段測试的话,效果会更明显。

尽管管道在一定程度上对性能有所提升,可是在使用时一点要注意。每一个命令的返回结果是先被缓存在server端的,最后一次性返回给client。假设一次批量提交涉及大量的返回结果,可能会导至server的内存溢出。这在生产环境是致命的。一次批次处理多少量,最好在设计阶段做出合理评估。

最后,管道仅仅是一个方案。并不意味着在不论什么时候都要尽可能的使用它。而是应该结合考虑网络延迟时间、业务涉及的请求量等等因素综合考虑。毕竟创建管道本身也会有一定的消耗。


深入浅出Redis(三)高级特性:管道的更多相关文章

  1. Redis进阶实践之五Redis的高级特性

    一.引言    上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性 ...

  2. Redis进阶实践之五Redis的高级特性(转载 5)

    Redis进阶实践之五Redis的高级特性 一.引言 上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今 ...

  3. RabbitMQ实战(三)-高级特性

    0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...

  4. python学习笔记(三)高级特性

    一.切片 list.tuple常常截取某一段元素,截取某一段元素的操作很常用 ,所以python提供了切片功能. L=['a','b','c','d','e','f'] #取索引0,到索引3的元素,不 ...

  5. Redis的高级特性哨兵

    一.哨兵介绍 Redis Sentinel,即Redis哨兵,在Redis 2.8版本开始引入.哨兵的核心功能是主节点的自动故障转移.下面是Redis官方文档对于哨兵功能的描述: 监控(Monitor ...

  6. Redis的高级特性一览

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 应用场景 缓存系统:用于缓解数据库的高并发压力 计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数 ...

  7. python3精简笔记(三)——高级特性

    Python中 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 取一个list或tuple的部分元素是非常常见的操作.Python提供了切片(Slice)操作符 L ...

  8. redis多实例与主从同步及高级特性(数据过期机制,持久化存储)

    redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...

  9. 深入浅出Redis(二)高级特性:事务

    第一篇中介绍了Redis是一个强大的键-值仓储,支持五种灵活的数据结构.其实,Redis还支持其他的一些高级特性:事务.公布与订阅.管道.脚本等,本篇我们来看一下事务. 前一篇中我们提到,在Redis ...

  10. 【Redis】二、Redis高级特性

    (三) Redis高级特性   前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解, ...

随机推荐

  1. ie8不支持伪类选择器的解决方案

    引用jQuery的插件jquery.pseudo.js插件内容: (function($){ var patterns = { text: /^['"]?(.+?)["']?$/, ...

  2. 万能的搜索--之BFS(三)

    接着(一)start (二)广度优先搜索(BFS) 广度优先搜索(又称宽度优先搜索算法)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.   Dijkstra单源最短路径算法和Pri ...

  3. luogu P1205 方块转换

    题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式: 1:转90度:图案按顺时针 ...

  4. CF993E Nikita and Order Statistics 多项式卷积 快速傅里叶变换

    题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真 ...

  5. ArrayList 和 LinkedList 区别。

    1. ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用.他们都可以对元素的增删改查进行操作. 2. ArrayList是实现了基于动态数组的数据结构,L ...

  6. 不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

    程序处理 这是一个历史遗留系统, 旧的系统是C++开发的, 插入数据的时候, 没有统一MYSQL各个层次(服务器, 数据库, 表, 列)的编码, 这个情况基本上是MYSQL的默认安装导致的, 实际的数 ...

  7. POJ 1905 Expanding Rods (求直杆弯曲拱起的高度)(二分法,相交弦定理)

    Description When a thin rod of length L is heated n degrees, it expands to a new length L' = (1+n*C) ...

  8. 【HIHOCODER 1133】 二分·二分查找之k小数

    描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000) ...

  9. python直接赋值、深浅拷贝实例剖析

    根据数据类型分为两部分进行剖析: int.str类型      list.tuple.dict类型等 1.  int.str类型 [int类型实例] >>> import copy ...

  10. [POJ3041] Asteroids(最小点覆盖-匈牙利算法)

    传送门 题意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次.   解析: 把每一行与每一列当做二分图两边的点. 某格子有障碍,则对应行与列连边. ...