主頁 > 知識庫 > redis cluster支持pipeline的實現(xiàn)思路

redis cluster支持pipeline的實現(xiàn)思路

熱門標簽:AI電銷 百度競價排名 地方門戶網(wǎng)站 服務外包 呼叫中心市場需求 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) Linux服務器

什么是pipeLine 為什么使用pipeLine ?

上篇文章給大家介紹過redis為什么要提供pipeline功能 今天給大家普及redis cluster如何支持pipeline?

管道(pipeline)將客戶端 client 與服務器端的交互明確劃分為單向的發(fā)送請求(Send Request)和接收響應(Receive Response):用戶可以將多個操作連續(xù)發(fā)給服務器,但在此期間服務器端并不對每個操作命令發(fā)送響應數(shù)據(jù);全部請求發(fā)送完畢后用戶關閉請求,開始接收響應獲取每個操作命令的響應結(jié)果。

管道(pipeline)在某些場景下非常有用,比如有多個操作命令需要被迅速提交至服務器端,但用戶并不依賴每個操作返回的響應結(jié)果,對結(jié)果響應也無需立即獲得,那么管道就可以用來作為優(yōu)化性能的批處理工具。性能提升的原因主要是減少了 TCP 連接中交互往返的開銷。

不過在程序中使用管道請注意,使用 pipeline 時客戶端將獨占與服務器端的連接,此期間將不能進行其他“非管道”類型操作,直至 pipeline 被關閉;如果要同時執(zhí)行其他操作,可以為 pipeline 操作單獨建立一個連接,將其與常規(guī)操作分離開來。

當我們要操作一批key時,可以通過 redis pipline 再執(zhí)行完后一次性讀取所有結(jié)果來較少網(wǎng)絡傳輸?shù)南模?很明顯,這有個限制條件 => 這批key的執(zhí)行必須在同一個連接上

當部署的redis為 standalone 或 master-slave 結(jié)構(gòu)的時候還好,可以從 pool 取出來的連接都是一個 master 節(jié)點的, 那要是 redis cluster 的時候怎么辦? 這批key 可能在同一個 redis node 也可能分散在多個 redis nodes 這樣就是多個連接了

redis cluster 雖然自動對 key 進行了分片,但是它對 client 的要求比較高,需要客戶端連接所有 cluster 內(nèi)的節(jié)點(這個和 db client方案類似)并緩存 slots分配信息,然后在客戶端采用同樣的算法進行hash后定位 key 的 slot 進而定位 slot 所屬的 redis 節(jié)點,然后獲取對應節(jié)點的連接發(fā)送命令

cluster pipeline 實現(xiàn)思路

java 常用的客戶端 jedis,雖然提供了 redis-cluster 功能,但是并沒有提供 cluster 下的 pipeline 能力,我們借助它封裝好的 JedisClusterCRC16 工具去計算 slot 定位對應 redis node 的連接,按照 redis node 將這批 key 進行分組 ,那么每組 key 就能分別進行 pipeline 邏輯了

偽代碼

static ListInteger, HostAndPort> slot2NodeMap; // 可以通過主動調(diào)用Jedis.clusterNodes獲取slot映射關系,并緩存在本地

ListObject> clusterPipeline(List keys) {
	 MapHostAndPort, ListString>> node2Keys= new HashMap>();  // 節(jié)點對應keys分組
	for(String key : keys) {
	   // 計算key對應的slot
	   int slot = JedisClusterCRC16.getSlot(key); 
	   // 根據(jù)slot獲取對應的節(jié)點信息,將同一節(jié)點的key收在一組
	  node2Keys.get(slot2NodeMap.get(slot)).add(key);
	}

    ListObject> results = new ArrayList();
	// 分組執(zhí)行
	for (Map.EntryHostAndPort, ListString>> group : node2Keys) {
		Jedis jedis =  JedisClusterConnectionHandler.getConnectionFromNode(group.key);
		PipeLine pipeline = jedis.pipelined();
		// 執(zhí)行本組keys 
		 result.addAll(jedis.syncAndReturnAll());
	}
   return results;
}

注意:在 cluster 上執(zhí)行 pipeline 可能會由于 redis 節(jié)點擴縮容 中途 redirection 切換連接導致結(jié)果丟失; 可以把 attempts 重試次數(shù)設為0 不允許自動切換連接 以感知到異常,然后業(yè)務主動進行重試

jedis 官方支持?

github 上其實2017年就有人提交了 cluster pipeline 的pr,維護人員也很樂意 merge 但是~~ 后續(xù)跟進比較慢,然后19年 merge review的時候有些異常,提交人也沒再跟進,導致一直沒有合并成功;
https://github.com/redis/jedis/pull/1455


實現(xiàn) cluster pipeline 也可以參考這個pr 的提交代碼

以上就是redis cluster支持pipeline的實現(xiàn)思路的詳細內(nèi)容,更多關于redis cluster支持pipeline的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Redis cluster集群的介紹
  • Spring-data-redis操作redis cluster的示例代碼
  • Windows環(huán)境下Redis Cluster環(huán)境搭建(圖文)
  • 如何用docker部署redis cluster的方法
  • 在Redis集群中使用pipeline批量插入的實現(xiàn)方法
  • python使用pipeline批量讀寫redis的方法
  • 詳解Java使用Pipeline對Redis批量讀寫(hmset&hgetall)
  • 詳解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

標簽:仙桃 衡水 蘭州 銅川 湖南 黃山 湘潭 崇左

巨人網(wǎng)絡通訊聲明:本文標題《redis cluster支持pipeline的實現(xiàn)思路》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266