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
import
redis
import
time
def
without_pipeline():
r
=
redis.redis()
for
i
in
range
(
10000
):
r.ping()
return
def
with_pipeline():
r
=
redis.redis()
pipeline
=
r.pipeline()
for
i
in
range
(
10000
):
pipeline.ping()
pipeline.execute()
return
def
bench(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...