[toc]
## 簡述
Redis 管道技術可以在服務端未響應時,客戶端可以繼續向服務端發送請求,并最終一次性讀取所有服務端的響應。也就是多次IO操作合并成一次IO操作。Redis 管道 (Pipeline) 本身并不是 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的參數值進行測試;