[toc]php
Redis 管道技术能够在服务端未响应时,客户端能够继续向服务端发送请求,并最终一次性读取全部服务端的响应。也就是屡次IO操做合并成一次IO操做。Redis 管道 (Pipeline) 自己并非 Redis 服务器直接提供的技术,这个技术本质上是由客户端提供的,跟服务器没有什么直接的关系。python
使用管道前:redis
使用管道后:服务器
对于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的参数值进行测试;