[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的參數值進行測試;