通知短信+运营短信,5秒速达,支持群发助手一键发送🚀高效触达和通知客户 广告
[toc] ## 简述 Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。也就是多次IO操作合并成一次IO操作。Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,这个技术本质上是由客户端提供的,跟服务器没有什么直接的关系。 **使用管道前:** ![](https://box.kancloud.cn/7f1e1255c78f8ee67690ea881d4a19c2_609x881.png) **使用管道后:** ![](https://box.kancloud.cn/5195fdcb0d546d3777a6ab4ac413c4ff_640x570.png) 对于Redis来说,还是需要进行3次子查询,但是对于整个系统来说,网络通信的次数明显就减少了,并发自然就上去了,吞吐自然也上去了。 ## 示例 管道技术一般应用在程序语言的客户端中。**注意:管道只是redis合并多次IO操作的一个优化手段,并不具备原子性,隔离性等事务特性**。但是在程序语言中,常常配合事务,提高IO性能。 **python中** ``` pipe = redis.pipeline(transaction=true) pipe.multi() pipe.incr("books") pipe.incr("books") values = pipe.execute() ``` **php** 多个命令一起执行,multi默认的参数是通过事务,可选为Redis::PIPELINE。管道模式并不能保证原子性,只能提高多个命令的传输速度。 ~~~ $ret = $redis->multi(Redis::PIPELINE) ->set('key1', 'val1') ->get('key1') ->set('key2', 'val2') ->get('key2') ->exec(); ~~~ ## 压测 Redis 自带了一个压力测试工具`redis-benchmark`,使用这个工具就可以进行管道测试。 首先我们对一个普通的 set 指令进行压测,QPS 大约 5w/s。 ``` > redis-benchmark -t set -q SET: 51975.05 requests per second ``` 我们加入管道选项`-P`参数,它表示单个管道内并行的请求数量,看下面`P=2`,QPS 达到了 9w/s。 ``` > redis-benchmark -t set -P 2 -q SET: 91240.88 requests per second ``` 如果CPU允许,还可以再提高P的参数值进行测试;