欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年06月23日 16:49:15   作者:mushishi  
本文給大家介紹redis cluster支持pipeline的實現(xiàn)思路,在 cluster 上執(zhí)行 pipeline 可能會由于 redis 節(jié)點擴縮容 中途 redirection 切換連接導致結(jié)果丟失,具體細節(jié)問題請參考下本文

什么是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 List<Integer, HostAndPort> slot2NodeMap; // 可以通過主動調(diào)用Jedis.clusterNodes獲取slot映射關系,并緩存在本地

List<Object> clusterPipeline(List keys) {
	 Map<HostAndPort, List<String>> 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);
	}

    List<Object> results = new ArrayList();
	// 分組執(zhí)行
	for (Map.Entry<HostAndPort, List<String>> 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的主從架構(gòu)

    一文帶你深入理解Redis的主從架構(gòu)

    Redis主從架構(gòu)是一種分布式數(shù)據(jù)庫架構(gòu),它包括一個主節(jié)點(Master)和一個或多個從節(jié)點(Slave),主節(jié)點處理所有寫操作,從節(jié)點負責復制主節(jié)點的數(shù)據(jù)并處理讀請求,本文將帶大家深入理解Redis主從架構(gòu),需要的朋友可以參考下
    2023-09-09
  • 淺談RedisTemplate和StringRedisTemplate的區(qū)別

    淺談RedisTemplate和StringRedisTemplate的區(qū)別

    本文主要介紹了RedisTemplate和StringRedisTemplate的區(qū)別及個人見解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • redis批量刪除key的步驟

    redis批量刪除key的步驟

    本文分享最新版Redis批量刪除key的方法,希望能幫到遇到同樣問題的網(wǎng)友。
    2020-09-09
  • redis限流的實際應用

    redis限流的實際應用

    這篇文章主要介紹了redis限流的實際應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • redis主從復制原理的深入講解

    redis主從復制原理的深入講解

    這篇文章主要給大家介紹了關于redis主從復制原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Redis 的 GeoHash詳解

    Redis 的 GeoHash詳解

    這篇文章主要介紹了Redis 的 GeoHash詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Redis實現(xiàn)分布式鎖詳解

    Redis實現(xiàn)分布式鎖詳解

    這篇文章主要介紹了redis如何實現(xiàn)分布式鎖,文章中有詳細的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-04-04
  • Centos7 Redis主從搭建配置的實現(xiàn)

    Centos7 Redis主從搭建配置的實現(xiàn)

    這篇文章主要介紹了Centos7 Redis主從搭建配置的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Redis分布式鎖的使用和實現(xiàn)原理詳解

    Redis分布式鎖的使用和實現(xiàn)原理詳解

    這篇文章主要給大家介紹了關于Redis分布式鎖的使用和實現(xiàn)原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Redis對象與redisObject超詳細分析源碼層

    Redis對象與redisObject超詳細分析源碼層

    這篇文章主要介紹了Redis對象與redisObject源碼層的分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11

最新評論