濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > redis cluster支持pipeline的實(shí)現(xiàn)思路

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

熱門(mén)標(biāo)簽:日本中國(guó)地圖標(biāo)注 宿遷便宜外呼系統(tǒng)平臺(tái) 魔獸2青云地圖標(biāo)注 北京400電話辦理收費(fèi)標(biāo)準(zhǔn) 山東外呼銷售系統(tǒng)招商 超呼電話機(jī)器人 十堰營(yíng)銷電銷機(jī)器人哪家便宜 貴州電銷卡外呼系統(tǒng) 鄭州人工智能電銷機(jī)器人系統(tǒng)

什么是pipeLine 為什么使用pipeLine ?

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

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

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

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

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

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

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

cluster pipeline 實(shí)現(xiàn)思路

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

偽代碼

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

ListObject> clusterPipeline(List keys) {
	 MapHostAndPort, ListString>> node2Keys= new HashMap>();  // 節(jié)點(diǎn)對(duì)應(yīng)keys分組
	for(String key : keys) {
	   // 計(jì)算key對(duì)應(yīng)的slot
	   int slot = JedisClusterCRC16.getSlot(key); 
	   // 根據(jù)slot獲取對(duì)應(yīng)的節(jié)點(diǎn)信息,將同一節(jié)點(diǎn)的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 可能會(huì)由于 redis 節(jié)點(diǎn)擴(kuò)縮容 中途 redirection 切換連接導(dǎo)致結(jié)果丟失; 可以把 attempts 重試次數(shù)設(shè)為0 不允許自動(dòng)切換連接 以感知到異常,然后業(yè)務(wù)主動(dòng)進(jìn)行重試

jedis 官方支持?

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


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

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

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

標(biāo)簽:大慶 果洛 江蘇 朝陽(yáng) 北京 吉安 楊凌 臺(tái)州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《redis cluster支持pipeline的實(shí)現(xiàn)思路》,本文關(guān)鍵詞  redis,cluster,支持,pipeline,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《redis cluster支持pipeline的實(shí)現(xiàn)思路》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于redis cluster支持pipeline的實(shí)現(xiàn)思路的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    霸州市| 固原市| 保康县| 兴文县| 阜南县| 吉林市| 上饶县| 汕尾市| 临夏市| 灵山县| 屏南县| 班戈县| 昌邑市| 建平县| 红安县| 多伦县| 乌兰浩特市| 防城港市| 华池县| 阿瓦提县| 松阳县| 曲阜市| 仙游县| 阿城市| 永修县| 吕梁市| 南汇区| 博爱县| 米易县| 新化县| 醴陵市| 彰化县| 沾益县| 樟树市| 信宜市| 齐河县| 昌邑市| 镇平县| 万载县| 禄丰县| 临沭县|