Redis 新特性 pipeline(管道)

2021-09-21 15:48:56 字數 3100 閱讀 9209

redis本身是乙個cs模式的tcp server, client可以通過乙個socket連續發起多個請求命令。 每個請求命令發出後client通常會阻塞並等待redis服務端處理,redis服務端處理完後將結果返回給client。

redis的pipeline(管道)功能在命令列中沒有,但redis是支援pipeline的,而且在各個語言版的client中都有相應的實現。 由於網路開銷延遲,即算redis server端有很強的處理能力,也由於收到的client訊息少,而造成吞吐量小。當client 使用pipelining 傳送命令時,redis server必須部分請求放到佇列中(使用記憶體)執行完畢後一次性傳送結果;如果傳送的命名很多的話,建議對返回的結果加標籤,當然這也會增加使用的記憶體;

pipeline在某些場景下非常有用,比如有多個command需要被「及時的」提交,而且他們對相應結果沒有互相依賴,而且對結果響應也無需立即獲得,那麼pipeline就可以充當這種「批處理」的工具;而且在一定程度上,可以較大的提公升效能,效能提公升的原因主要是tcp鏈結中較少了「互動往返」的時間。不過在編碼時請注意,pipeline期間將「獨佔」鏈結,此期間將不能進行非「管道」型別的其他操作,直到pipeline關閉;如果你的pipeline的指令集很龐大,為了不干擾鏈結中的其他操作,你可以為pipeline操作新建client鏈結,讓pipeline和其他正常操作分離在2個client中。不過pipeline事實上所能容忍的操作個數,和socket-output緩衝區大小/返回結果的資料尺寸都有很大的關係;同時也意味著每個redis-server同時所能支撐的pipeline鏈結的個數,也是有限的,這將受限於server的物理記憶體或網路介面的緩衝能力。

python 測試**:

同時提交10000個command:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/python2

importredis

importtime

defwithout_pipeline():

r=redis.redis()

foriinrange(10000):

r.ping()

return

defwith_pipeline():

r=redis.redis()

pipeline=r.pipeline()

foriinrange(10000):

pipeline.ping()

pipeline.execute()

return

defbench(desc):

start=time.clock()

desc()

stop=time.clock()

diff=stop-start

print"%s has token %s"%(desc.func_name,str(diff))

if__name__=='__main__':

bench(without_pipeline)

bench(with_pipeline)

測試結果:

[root@localhost ~]# python2 redis_piple.py 

without_pipeline has token 1.11

with_pipeline has token 0.29

注:在本機測試,基本忽略網路延遲,pipeline還是有很高的效能的。

redis知識盤點 捌 redis新特性

這個月終於有了一些時間,看了幾本書。歸。繼續更新。這次還是先分享幾個redis之前沒寫的新特性。2.8版本引入,可用於巨量去重統計,比如統計uv。有點是需要空間很小,只有12kb 缺點是平均會有0.81 的誤差。不過當統計量級特別大的時候,hyperloglog的價效比還是很高的。主要有三個指令 p...

redis5 0的12項新特性

目錄 1 新的stream資料型別 2 新的redis模組的api times and cluster api 3 rdb現在儲存的lfu和lru資訊 4 集群管理器從ruby移植到c 5 新的sorted set 命令 zpop min max 和阻塞變種 6 主動碎片整理v2 debug pop...

新特性筆記

特點 framgent 它不是activity,也不是四大元件之一,不需要androidmanifest.xml註冊,好比是乙個縮小版的activity,有著自己的介面和生命週期方法,以及接受屬於它自己的輸入事件 fragment 在 android 3.1版本中引入,片段可以復用 fragment...