最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

什么是pipeLine 為什么使用pipeLine ?

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

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

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

不過(guò)在程序中使用管道請(qǐng)注意,使用 pipeline 時(shí)客戶(hù)端將獨(dú)占與服務(wù)器端的連接,此期間將不能進(jìn)行其他“非管道”類(lèi)型操作,直至 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 的要求比較高,需要客戶(hù)端連接所有 cluster 內(nèi)的節(jié)點(diǎn)(這個(gè)和 db client方案類(lèi)似)并緩存 slots分配信息,然后在客戶(hù)端采用同樣的算法進(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 常用的客戶(hù)端 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 List<Integer, HostAndPort> slot2NodeMap; // 可以通過(guò)主動(dòng)調(diào)用Jedis.clusterNodes獲取slot映射關(guān)系,并緩存在本地

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

    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 可能會(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)文章!

相關(guān)文章

  • Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案

    Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案

    Redis作為一種高效的鍵值對(duì)存儲(chǔ)系統(tǒng),常用于緩存數(shù)據(jù)庫(kù)減少I(mǎi)O操作,下面這篇文章主要介紹了Redis與數(shù)據(jù)庫(kù)數(shù)據(jù)一致性的原因及解決方案,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Redis+攔截器實(shí)現(xiàn)接口防刷

    Redis+攔截器實(shí)現(xiàn)接口防刷

    接口防刷有很多種實(shí)現(xiàn)思路,例如:攔截器/AOP+Redis、攔截器/AOP+本地緩存、前端限制等等很多種實(shí)現(xiàn)思路,本文主要來(lái)講一下?攔截器+Redis?的實(shí)現(xiàn)方式,需要的可以參考下
    2023-08-08
  • Caffeine實(shí)現(xiàn)類(lèi)似redis的動(dòng)態(tài)過(guò)期時(shí)間設(shè)置示例

    Caffeine實(shí)現(xiàn)類(lèi)似redis的動(dòng)態(tài)過(guò)期時(shí)間設(shè)置示例

    這篇文章主要為大家介紹了Caffeine實(shí)現(xiàn)類(lèi)似redis的動(dòng)態(tài)過(guò)期時(shí)間示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 設(shè)置Redis最大占用內(nèi)存的實(shí)現(xiàn)

    設(shè)置Redis最大占用內(nèi)存的實(shí)現(xiàn)

    本文主要介紹了設(shè)置Redis最大占用內(nèi)存的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • redis分布式鎖的8大坑總結(jié)梳理

    redis分布式鎖的8大坑總結(jié)梳理

    這篇文章主要介紹了redis分布式鎖的8大坑總結(jié)梳理,使用redis的分布式鎖,我們首先想到的可能是setNx命令,文章圍繞setNx命令展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-07-07
  • 淺談一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性

    淺談一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性

    這篇文章主要介紹了一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性,今天這篇文章就帶你詳細(xì)了解一下四種同步策略,需要的朋友可以參考下
    2023-03-03
  • Redis實(shí)現(xiàn)持久化的方式匯總

    Redis實(shí)現(xiàn)持久化的方式匯總

    Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。它跟memcached類(lèi)似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類(lèi)型很豐富。今天我們就來(lái)看看如何實(shí)現(xiàn)Redis持久化,需要的朋友可以參考下
    2022-10-10
  • Redis中跳表的實(shí)現(xiàn)原理分析

    Redis中跳表的實(shí)現(xiàn)原理分析

    Redis中的跳表是一種高效的多層鏈表結(jié)構(gòu),通過(guò)隨機(jī)概率算法決定節(jié)點(diǎn)的層數(shù),從而實(shí)現(xiàn)快速的插入、刪除和查詢(xún)操作,跳表的平均時(shí)間復(fù)雜度為O(logn),最差情況為O(n),每個(gè)節(jié)點(diǎn)包含值和指向更高層節(jié)點(diǎn)的指針,以及回退指針以提高操作效率
    2025-02-02
  • Redis中常見(jiàn)的幾種集群部署方案

    Redis中常見(jiàn)的幾種集群部署方案

    本文主要介紹了Redis中常見(jiàn)的幾種集群部署方案,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis實(shí)現(xiàn)用戶(hù)簽到的示例代碼

    Redis實(shí)現(xiàn)用戶(hù)簽到的示例代碼

    Redis的位圖可以高效實(shí)現(xiàn)用戶(hù)簽到功能,每個(gè)bit位對(duì)應(yīng)一個(gè)簽到狀態(tài),節(jié)省存儲(chǔ)空間,利用SETBIT、GETBIT等命令操作簽到數(shù)據(jù),可統(tǒng)計(jì)連續(xù)簽到天數(shù)和本月簽到情況,感興趣的可以了解一下
    2024-09-09

最新評(píng)論

山丹县| 肥西县| 黄陵县| 绥滨县| 白银市| 梧州市| 麻栗坡县| 游戏| 微博| 珲春市| 女性| 蓝山县| 吉林省| 临桂县| 福州市| 儋州市| 庄河市| 盐亭县| 探索| 东至县| 陇南市| 内江市| 新邵县| 娄烦县| 筠连县| 潜江市| 电白县| 汕头市| 梁河县| 盱眙县| 桂平市| 婺源县| 龙海市| 深州市| 乌苏市| 都江堰市| 紫阳县| 桂平市| 桃园市| 汝城县| 凌海市|