使用正常和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
建議兩篇看看,且對比下
批量插入:
但實際上遇到的問題是,專案上所用到的redis是集群,初始化的時候使用的類是jediscluster而不是jedis. 去查了jediscluster的文件, 並沒有發現提供有像jedis一樣的獲取pipeline物件的 pipelined()方法.string key =
"key"
;jedis jedis =
newjedis
("xx.xx.xx.xx");
pipeline p = jedis.
pipelined()
;list
mydata =..
..//要插入的資料列表
for(string data: mydata)
p.sync()
;jedis.
close()
;
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)
;
上面這幾步可以在初始化的時候就完成. 不需要每次都呼叫, 把nodemap和slothostmap都定義為靜態變數.private
static treemap
getslothostmap
(string anyhostandportstr)
jedis.
close()
;}catch
(exception e)
return tree;
}
建議上面這步操作可以封裝成乙個靜態方法, 比如命名為public static jedis getjedisbykey(string key) 之類的. 意思就是在集群中, 通過key獲取到這個key所對應的jedis物件.//獲取槽號
int slot = jedisclustercrc16.
getslot
(key)
;//獲取到對應的jedis物件
map.entry
entry = slothostmap.
lowerentry
(long.
valueof
(slot));
jedis jedis = nodemap.
get(entry.
getvalue()
).getresource()
;
這樣再通過上面的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模式,客戶端可以一次性的傳送多個...