java redis 流水线_Redis附加功能之Redis流水线pipeline
流水線功能的目的:通過減少客戶端與服務(wù)器之間的通信次數(shù)來提高程序的執(zhí)行效率。
一、通信
在一般情況下, 用戶每執(zhí)行一個 Redis 命令,客戶端與服務(wù)器都需要進行一次通信:客戶端會將命令請求發(fā)送給服務(wù)器,而服務(wù)器則會將執(zhí)行命令所得的結(jié)果返回給客戶端。
當程序執(zhí)行一些復(fù)雜的操作時, 客戶端可能需要執(zhí)行多個命令, 并與服務(wù)器進行多次通信。
假設(shè)我們正在構(gòu)建一個為圖書打標簽(tag)的網(wǎng)站,這個網(wǎng)站上的每本圖書都可以被打上任意多個標簽。并且為了記錄哪些標簽的圖書是最多人閱覽的,我們會為每個標簽創(chuàng)建一個點擊計數(shù)器,每當用戶瀏覽網(wǎng)站上的某本書時,程序就會對該書擁有的各個標簽的點擊計數(shù)器執(zhí)行增一操作。
舉個例子,對于《Redis in Action》這本書,用戶可能會給它打上“計算機”、“編程”、“數(shù)據(jù)庫”和“Redis”這四個標簽,每次當《Redis in Action》的頁面被訪問時,程序就會對這四個標簽的點擊計數(shù)器執(zhí)行增一操作:
INCR tag::計算機::click_counter
INCR tag::編程::click_counter
INCR tag::數(shù)據(jù)庫::click_counter
INCR tag::Redis::click_counter
對于這個點擊計數(shù)程序來說,客戶端要執(zhí)行的 INCR 命令次數(shù)取決于書本的標簽數(shù)量,而標簽的數(shù)量越多, 要執(zhí)行的 INCR 命令就越多。
下圖展示了《Redis in Action》的頁面被查看時,客戶端和服務(wù)器之間進行的通信情況。
因為 Redis 服務(wù)器的性能非常高,所以當一個命令請求抵達服務(wù)器之后,服務(wù)器通常很快就會將命令執(zhí)行完畢,并向客戶端返回命令的執(zhí)行結(jié)果。
在多數(shù)情況下,客戶端在執(zhí)行 Redis 命令時,大部分等待時間都耗費在了發(fā)送命令請求和接收命令回復(fù)上面。
二、流水線功能
對于前面展示的點擊計數(shù)器這種需要執(zhí)行多個命令的程序來說, 如果我們能減少程序執(zhí)行時, 客戶端與服務(wù)器之間的通信次數(shù), 就能夠有效地提升程序的性能, 而 Redis 的流水線功能(pipeline)就是為此而設(shè)置的。
Redis 的流水線功能允許客戶端一次將多個命令請求發(fā)送給服務(wù)器, 并將被執(zhí)行的多個命令請求的結(jié)果在一個命令回復(fù)中全部返回給客戶端, 使用這個功能可以有效地減少客戶端在執(zhí)行多個命令時需要與服務(wù)器進行通信的次數(shù)。
以前面列出的點擊計數(shù)器為例, 我們可以將多條 INCR 命令都包裹到一個流水線里面執(zhí)行, 使得程序在執(zhí)行 N 個 INCR 命令時所需的通信次數(shù)從 N 次降低為一次。
下圖展示了流水線功能是如何將更新《Redis in Action》各個標簽的點擊計數(shù)器所需的通信次數(shù)從四次降低為一次的。
三、Python 客戶端中的流水線功能
各個 Redis 客戶端使用流水線功能的方法都不一樣, 以下代碼展示了在使用 Python 客戶端的情況下, 開啟流水線功能來更新《Redis in Action》各個標簽的點擊計數(shù)器的方法:
from redis importRedis#創(chuàng)建 Redis 客戶端
client =Redis()#創(chuàng)建一個流水線對象,包裹四個 INCR 命令#transaction=False 表示關(guān)閉事務(wù)功能,只使用流水線功能#關(guān)于事務(wù)方面的詳細信息我們稍后就會介紹
pipeline = client.pipeline(transaction=False)
pipeline.incr('tag::計算機::click_counter')
pipeline.incr('tag::編程::click_counter')
pipeline.incr('tag::數(shù)據(jù)庫::click_counter')
pipeline.incr('tag::Redis::click_counter')#以流水線形式發(fā)送被包裹的四個命令
pipeline.execute()
以流水線方式執(zhí)行的多個命令的結(jié)果會在一個命令回復(fù)中被返回, 以下是上面的計數(shù)器更新代碼的執(zhí)行結(jié)果:
#多個命令的結(jié)果會以列表的形式返回#列表的第一個項 10087 是 tag::計算機::click_counter 的值#第二個項 5001 是 tag::編程::click_counter 的值#第三個項 3421 是 tag::數(shù)據(jù)庫::click_counter 的值#第四個項 1001 是 tag::Redis::click_counter 的值
[10087, 5001, 3421, 1001]
四、小結(jié)
在一般情況下,用戶每執(zhí)行一個 Redis 命令,客戶端和服務(wù)器都需要進行一次通信:客戶端向服務(wù)器發(fā)送命令請求,而服務(wù)器則會將執(zhí)行命令所得的命令回復(fù)返回給客戶端;
在大多數(shù)情況下, 執(zhí)行命令時的絕大部分時間都耗費在了發(fā)送命令和接收回復(fù)的過程上,因此減少客戶端與服務(wù)器之間的通信次數(shù),可以有效地提高程序的執(zhí)行效率;
流水線可以將多條命令打包一起發(fā)送,并且在一次回復(fù)中接收所有被執(zhí)行命令的結(jié)果,使用這個功能可以有效地提升程序在執(zhí)行多條命令時的效率;
總結(jié)
以上是生活随笔為你收集整理的java redis 流水线_Redis附加功能之Redis流水线pipeline的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑QQ登录测试用例
- 下一篇: 2016世界人工智能大会 AI领袖共启智