<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Redis是一個client-server
模式的TCP服務,也被稱為Request/Response
協定的實現。
這意味著通常一個請求的完成是遵循下面兩個步驟:
舉個例子
Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4
Clients和Servers是通過網路進行連線。這就意味著網路連線可能會很快(比如迴環網路,即本機網路),也可能很慢(比如兩個主機之間存在多跳網路)。不管網路怎麼樣,一個封包從Client到Server,然後相應值又從Server返回Client都需要一定的時間。
這個時間被稱為RTT(Round Trip Time)。當一個Client需要執行多個連續請求(比如新增許多個元素到一個list中,或者清掉Redis中許多個鍵值對),那麼RTT是怎樣影響到效能的呢?這個也是很方便去計算的。比如如果RTT的時間為250ms(假設網際網路連線速度非常慢),即使Server可以每秒處理100k個請求,那麼最多也只能接受每秒4個請求。
如果是迴環網路,RTT將會特別的短(比如作者的127.0.0.1,RTT的響應時間為44ms),但是對於執行連續多次寫操作時,也是一筆不小的消耗。
其實我們有其他辦法來降低這種場景的消耗,開心不?驚喜不?
在一個Request/Response
方式的服務中有一個特性:即使Client沒有收到之前的響應值,也可以繼續傳送新的請求。這種特性意味著我們可以不需要等待Server的響應,可以率先傳送許多操作命令給Server,然後在一次性讀取Server的所有響應值。
這種方式被稱為Pipelining
技術,該技術近幾十年來被廣泛的使用。比如多POP3協定的實現就支援這個特性,大大的提升了從server端下載新的郵件的速度。
Redis在很早的時候就支援該項技術,所以不管你執行的是什麼版本,你都可以使用pipelining
技術,比如這裡有一個使用 netcat 工具的:
$ (printf "PINGrnPINGrnPINGrn"; sleep 1) | nc localhost 6379 +PONG +PONG +PONG
現在我們不需要為每一次請求付出RTT的消耗了,而是一次性傳送三個操作命令。為了便於直觀的理解,還是拿之前的說明,使用pipelining
技術該的實現順序如下:
Client: INCR X Client: INCR X Client: INCR X Client: INCR X Server: 1 Server: 2 Server: 3 Server: 4
劃重點(敲黑板):當client使用pipelining
傳送操作命令時,server端將強制使用記憶體來排列響應結果。所以在使用pipelining
傳送大量的操作命令的時候,最好確定一個合理的命令條數,一批一批的傳送給Server端,比如傳送10k個操作命令,讀取響應結果,再傳送10k個操作命令,以此類推…雖然說耗時近乎相同,但是額外的記憶體消耗將是這10k操作命令的排列響應結果所需的最大值。(為防止記憶體耗盡,選擇一個合理的值)
Pipelining
不是減少因為 RTT 造成消耗的唯一方式,但是它確實幫助你極大的提升每秒的執行命令數量。事實的真相是:從存取相應的資料結構並且生成答覆結果的角度來看,不使用pipelining
確實代價很低;但是從通訊端socket I/O的角度來看,恰恰相反。因為這涉及到了read()
和write()
呼叫,需要從使用者態切換到核心態。這種上下文切換會特別損耗時間的。
一旦使用了pipelining
技術,很多操作命令將會從同一個read()
呼叫中執行讀操作,大量的答覆結果將會被分發到同一個write()
呼叫中執行寫操作。基於此,隨著管道的長度增加,每秒執行的查詢數量最開始幾乎呈直線型增加,直到不使用pipelining
技術的基準的10倍,如下圖:
不翻譯,基本上就是說使用了pipelining
提升了5倍效能。
Redis Scripting
(2.6+版本可用),通過使用在Server端完成大量工作的指令碼Scripting
,可以更加高效的解決大量pipelining
用例。使用指令碼Scripting
的最大好處就是在讀和寫的時候消耗更少的效能,使得像讀、寫、計算這樣的操作更加快速。(當client需要寫操作之前獲取讀操作的響應結果時,pepelining
就顯得相形見拙。) 有時候,應用可能需要在使用pipelining
時,傳送 EVAL
或者 EVALSHA
命令,這是可行的,並且Redis明確支援這麼這種SCRIPT LOAD
命令。(它保證可可以呼叫 EVALSHA
而不會有失敗的風險)。
讀完全文,你可能還會感到疑問:為什麼如下的Redis測試基準 benchmark
會執行這麼慢,甚至在Client和Server在一個物理機上也是如此:
FOR-ONE-SECOND: Redis.SET("foo","bar") END
畢竟Redis程序和測試基準benchmark
在相同的機器上執行,並且這是沒有任何實際的延遲和真實的網路參與,不就是訊息通過記憶體從一個地方拷貝到另一個地方麼? 原因是程序在作業系統中並不是一直執行。真實的情景是系統核心排程,排程到程序執行,它才會執行。比如測試基準benchmark
被允許執行,從Redis Server中讀取響應內容(與最後一次執行的命令相關),並且寫了一個新的命令。這時命令將在迴環網路的通訊端中,但是為了被Redis Server讀取,系統核心需要排程Redis Server程序(當前正在系統中掛起),周而復始。所以由於系統核心排程的機制,就算是在迴環網路中,仍然會涉及到網路延遲。 簡言之,在網路伺服器中衡量效能時,使用迴環網路測試並不是一個明智的方式。應該避免使用此種方式來測試基準。
換一種測試方式
到此這篇關於在Redis中使用Pipelining加速查詢的文章就介紹到這了,更多相關Redis加速查詢內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45