Redis中的批量操作Pipeline

2021-10-19 14:01:17 字數 2733 閱讀 8977

使用正常和pipeline的簡單對比

public class piplinetest 

public static

void

usepipeline()

pipeline.

sync()

; jedis.

close()

; system.out.

println

("usepipeline total time:"

+(system.

currenttimemillis()

- begin));

} public static

void

usenormal()

jedis.

close()

; system.out.

println

("usenormal total time:"

+(system.

currenttimemillis()

- begin));

} public static shardedjedis getshardedjedis()

}

輸出結果:

usenormal total time:

772usepipeline total time:

112

參考文獻:

建議兩篇看看,且對比下

批量插入:

string key =

"key"

;jedis jedis =

newjedis

("xx.xx.xx.xx");

pipeline p = jedis.

pipelined()

;list

mydata =..

..//要插入的資料列表

for(string data: mydata)

p.sync()

;jedis.

close()

;

但實際上遇到的問題是,專案上所用到的redis是集群,初始化的時候使用的類是jediscluster而不是jedis. 去查了jediscluster的文件, 並沒有發現提供有像jedis一樣的獲取pipeline物件的 pipelined()方法.

google了一下, 發現了解決方案.

redis集群規範有說: redis 集群的鍵空間被分割為 16384 個槽(slot), 集群的最大節點數量也是 16384 個。每個主節點都負責處理 16384 個雜湊槽的其中一部分。當我們說乙個集群處於「穩定」(stable)狀態時, 指的是集群沒有在執行重配置(reconfiguration)操作, 每個雜湊槽都只由乙個節點進行處理。

所以我們可以根據要插入的key知道這個key所對應的槽的號碼, 再通過這個槽的號碼從集群中找到對應jedis. 具體實現如下

//初始化得到了jedis cluster, 如何獲取hostandport集合**就不寫了

setnodes =..

...jediscluster jediscluster =

newjediscluster

(nodes)

;map

nodemap = jediscluster.

getclusternodes()

;string anyhost = nodemap.

keyset()

.iterator()

.next()

;//getslothostmap方法在下面有

treemap

slothostmap =

getslothostmap

(anyhost)

;

private

static treemap

getslothostmap

(string anyhostandportstr)

jedis.

close()

;}catch

(exception e)

return tree;

}

上面這幾步可以在初始化的時候就完成. 不需要每次都呼叫, 把nodemap和slothostmap都定義為靜態變數.

//獲取槽號

int slot = jedisclustercrc16.

getslot

(key)

;//獲取到對應的jedis物件

map.entry

entry = slothostmap.

lowerentry

(long.

valueof

(slot));

jedis jedis = nodemap.

get(entry.

getvalue()

).getresource()

;

建議上面這步操作可以封裝成乙個靜態方法, 比如命名為public static jedis getjedisbykey(string key) 之類的. 意思就是在集群中, 通過key獲取到這個key所對應的jedis物件.

這樣再通過上面的jedis.pipelined();來就可以進行批量插入了.

注:這個方法是從google上搜來的, 直到目前我使用起來還沒發現什麼問題. 如果哪位大神發現有什麼不對的地方歡迎提出來

Redis中的批量操作Pipeline

大多數情況下,我們都會通過請求 相應機制去操作redis。只用這種模式的一般的步驟是,先獲得jedis例項,然後通過jedis的get put方法與redis互動。由於redis是單執行緒的,下一次請求必須等待上一次請求執行完成後才能繼續執行。然而使用pipeline模式,客戶端可以一次性的傳送多個...

Redis中的批量操作Pipeline

大多數情況下,我們都會通過請求 相應機制去操作redis。只用這種模式的一般的步驟是,先獲得jedis例項,然後通過jedis的get put方法與redis互動。由於redis是單執行緒的,下一次請求必須等待上一次請求執行完成後才能繼續執行。然而使用pipeline模式,客戶端可以一次性的傳送多個...

Redis中的批量操作Pipeline

大多數情況下,我們都會通過請求 相應機制去操作redis。只用這種模式的一般的步驟是,先獲得jedis例項,然後通過jedis的get put方法與redis互動。由於redis是單執行緒的,下一次請求必須等待上一次請求執行完成後才能繼續執行。然而使用pipeline模式,客戶端可以一次性的傳送多個...