分布式緩存:ZSET → MGET 跨槽(cross‐slot)/ 并發 GET解決思路

文章目錄

  • 緩存全景圖
  • Pre
  • 問題描述
  • 解決思路
    • 一、管道(Pipelining)替代多線程
    • 二、使用 Hash Tag 保證數據同槽
    • 三、用 Hash 結構一次性批量取值
    • 四、把數據直接存進 ZSET(或用 RedisJSON)
  • 小結

在這里插入圖片描述


緩存全景圖

在這里插入圖片描述


Pre

分布式緩存:緩存設計三大核心思想

分布式緩存:緩存的三種讀寫模式及分類

分布式緩存:緩存架構設計的“四步走”方法

分布式緩存:緩存設計中的 7 大經典問題_緩存失效、緩存穿透、緩存雪崩

分布式緩存:緩存設計中的 7 大經典問題_數據不一致與數據并發競爭

分布式緩存:緩存設計中的 7 大經典問題_Hot Key和Big Key


問題描述

使用 Redis Cluster 時,經常會碰到 ZSET、MGET 跨槽(cross‐slot)或多線程大量并發 GET 導致的延遲和 CPU 問題, 下面說一下解決思路


解決思路

一、管道(Pipelining)替代多線程

  • 問題:用 20 個線程并發 GET,線程切換和上下文開銷很大,而且大量線程會競爭 Tomcat 線程池資源。

  • 建議:在單個線程里,對每個分片的若干 key 使用 Redis Pipeline。Pipeline 可以把多條命令打包,一次性發給同一個 Redis 節點,極大減少網絡往返(RTT)和線程切換開銷。

    1. 拿到分頁用的 ID 列表后,根據 ID 分別算出它們在 Cluster 中各自的 slot。
    2. 按 slot 分組,把屬于同一 slot 的 ID 列表用一次 pipeline 批量 GET
    3. 不同 slot 的分組各自 pipeline,最終合并結果即可。
  • 效果:比單條 GET 快,且不必啟 20 個線程,CPU 和線程池壓力都會大幅下降。


二、使用 Hash Tag 保證數據同槽

Redis Cluster 要求一次多鍵操作(如 MGET、Lua 腳本)只能作用于同一個 slot 才不會報錯。

  • 做法:給你的 ZSET key 和各個 ID key 都加上相同的Hash Tag,例如:

    ZSET key:   "user:123:{timeline}"
    ID key:     "user:123:{timeline}:item:456""user:123:{timeline}:item:789"
    

    這樣 Redis 會只對 {timeline} 這部分計算哈希槽,保證所有相關 key 都在同一個槽里。

  • 好處

    1. 就可以直接用一條 MGET user:123:{timeline}:item:456 user:123:{timeline}:item:789 …,或者一段 Lua 腳本 EVAL,一次性拉取多條數據。
    2. 避免了跨槽錯誤,也不需要分組 pipeline,代碼更簡單、性能更優。

三、用 Hash 結構一次性批量取值

如果每條“內容”可以看成一個小對象(多個字段),還可以:

  1. 把所有 ID 對應的內容都存到一個 Hash,Hash 名稱同樣帶上 Hash Tag:

    HSET user:123:{timeline}:items 456 "{…json…}" 789 "{…json…}"
    
  2. 查詢時,

    HKEYS        → 拿到所有 field(ID)  
    HGETALL 或 HMGET → 一次性批量獲取分頁這 20 條 content  
    
  • 優點:單個 key、單條命令就能拿到所有需要的 20 條數據,Redis 端沒有多次網絡往返。

四、把數據直接存進 ZSET(或用 RedisJSON)

如果對象比較小,也可考慮:

  • Option A:把內容序列化后直接當 ZSET 的 member 存儲,Score 用時間戳或自增序號。ZRANGE … WITHSCORES 一次性既拿 ID(member)又拿內容。
  • Option B:使用 RedisJSON 模塊,把每條對象存為 JSON,Key 同樣加 Hash Tag,ZSET 只存 ID,然后用 JSON.MGET(同槽下可跨多個 JSON key 一次取)來批量拉取。

小結

  1. Pipeline:最簡單,不改數據模型,按 slot 分組即可。
  2. Hash Tag:相同槽內可直接 MGET 或 Lua,一條命令搞定。
  3. Hash 結構:把多條對象聚到一個 key,HMGET 一次性取完。
  4. 直接存 ZSET 或 JSON 模塊:簡化訪問路徑,避免額外的 GET。

以上方案可以各取所長,或組合使用:比如既用 Hash Tag,又用 Pipeline;或直接把熱點數據存在 ZSET member 里。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82262.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開發AR導航助手:ARKit+Unity+Mapbox全流程實戰教程

引言 在增強現實技術飛速發展的今天,AR導航應用正逐步改變人們的出行方式。本文將手把手教你使用UnityARKitMapbox開發跨平臺AR導航助手,實現從虛擬路徑疊加到空間感知的完整技術閉環。通過本教程,你將掌握: AR空間映射與場景理…

助力 FPGA 國產化,ALINX 攜多款方案亮相深圳、廣州“紫光同創 FPGA 技術研討會”

5 月中旬,一年一度的紫光同創技術研討會系列活動正式拉開帷幕,相繼在深圳、廣州帶來 FPGA 技術交流盛宴。 ALINX 作為紫光同創官方合作伙伴,長期助力推動 FPGA 國產化應用發展,此次攜多款基于 Kosmo-2 系列產品開發的方案 demo 亮…

LeetCode 1040.移動石子直到連續II

在 X 軸上有一些不同位置的石子。給定一個整數數組 stones 表示石子的位置。 如果一個石子在最小或最大的位置,稱其為 端點石子。每個回合,你可以將一顆 端點石子 拿起并移動到一個未占用的位置,使得該石子不再是一顆 端點石子。 值得注意的…

梯度優化提示詞:精準引導AI分類

基于梯度優化的提示詞工程方法,通過迭代調整提示詞的嵌入向量,使其能夠更有效地引導模型做出正確分類。 數據形式 訓練數據 train_data 是一個列表,每個元素是一個字典,包含兩個鍵: text: 需要分類的文本描述label: 對應的標簽(“沖動"或"理性”)示例數據: …

JavaWeb:SpringBoot配置優先級詳解

3種配置 打包插件 命令行 優先級 SpringBoot的配置優先級決定了不同配置源之間的覆蓋關系,遵循高優先級配置覆蓋低優先級的原則。以下是詳細的優先級排序及配置方法說明: 一、配置優先級從高到低排序 1.命令行參數 優先級最高,通過keyvalu…

使用CentOS部署本地DeekSeek

一、查看服務器的操作系統版本 cat /etc/centos-release二、下載并安裝ollama 1、ollama下載地址: Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

Matplotlib 后端與事件循環

前言:很多時候,matplot跑出來的是這種靜態非交互的,如果想要可以交互,就得設定一個后端,例如 matplotlib.use(TkAgg)Matplotlib 后端 (Backend) Matplotlib 的設計理念是能夠以多種方式輸出圖形,無論是顯…

【JAVA】中文我該怎么排序?

📘 Java 中文排序教學文檔(基于 Collator) 🧠 目錄 概述Java 中字符串排序的默認行為為什么需要 Collator使用 Collator 進行中文排序升序 vs 降序排序自定義對象字段排序多字段排序示例總結對比表附錄:完整代碼示例 …

k8s-NetworkPolicy

在 Kubernetes 中,NetworkPolicy 是一種資源對象,用于定義 Pod 之間的網絡通信策略。它允許你控制哪些 Pod 可以相互通信,以及如何通信。通過使用 NetworkPolicy,可以實現更細粒度的網絡訪問控制,增強集群的安全性。 1…

LAN(局域網)和WAN(廣域網)

你的問題非常清晰!我來用一個直觀的比喻實際拓撲圖幫你徹底理解LAN(局域網)和WAN(廣域網)如何協同工作,以及路由器在其中的位置。你可以把整個網絡想象成一座城市: 1. 比喻:城市交通…

idea 插件開發自動發布到 nexus 私服中(腳本實例)

如下腳本內容為 idea 插件開發項目中的 build.gradle.kts 文件示例,其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 兩個任務,一個用來自動修改 nexus 中的配置文件,一個用來自動將當前插件打包后的 zip 文件上傳到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot應用場景對比

文章目錄 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的選擇如果SQL簡單且項目規模較小,推薦使…

C++復習核心精華

一、內存管理與智能指針 內存管理是C區別于其他高級語言的關鍵特性,掌握好它就掌握了C的靈魂。 1. 原始指針與內存泄漏 先來看看傳統C的內存管理方式: void oldWay() {int* p new int(42); // 分配內存// 如果這里發生異常或提前return&#xff0c…

期貨反向跟單軟件—提高盤手杠桿的方式及剖析

在期貨反向跟單領域,期貨跟單軟件對盤手杠桿的調節,是整個策略運作的核心環節之一。其背后蘊含著科學的金融邏輯。? 期貨跟單軟件提高盤手杠桿主要通過兩種方式。第一種是降低期貨保證金。在盤手資金總量固定的情況下,保證金降低&#xff0…

【計算機網絡】基于UDP進行socket編程——實現服務端與客戶端業務

🔥個人主頁🔥:孤寂大仙V 🌈收錄專欄🌈:Linux 🌹往期回顧🌹: 【Linux筆記】——網絡基礎 🔖流水不爭,爭的是滔滔不息 一、UDPsocket編程UDPsocket編…

ae卡通打架煙霧特效

1、創建一個合成(合成1),右鍵創建形狀圖層,使用橢圓工具,長按shift鍵拖動鼠標左鍵畫出圓形,同時按ctrlalthome三個鍵使圓形中心錨點對齊圓心,關閉描邊,圓形圖層填充白色。 2、選擇形…

UE5 Va Res發送請求、處理請求、json使用

文章目錄 介紹發送一個Get請求發送Post請求設置請求頭請求體帶添json發送請求完整的發送藍圖 處理收到的數據常用的json處理節點 介紹 UE5 自帶的Http插件,插件內自帶json解析功能 發送一個Get請求 只能寫在事件圖表里 發送Post請求 只能寫在事件圖表里 設置…

SQL 結構化模型設計與現代技術融合深度解讀

摘要 本文系統展示了基于 JSON Schema 的 SQL 結構化模型設計,包括通用定義、四大基本操作(SELECT、INSERT、UPDATE、DELETE)的模型規范,以及面向現代場景的設計擴展。重點結合數據權限控制、樂觀鎖并發控制、表單自動化、自定義…

el-dialog 組件 多層嵌套 被遮罩問題

<el-dialog title"提示" :visible.sync"dialogBindUserVisible" width"30%" append-to-body :before-close"handleClose"> <span>這是一段信息</span> <span slot"footer" class"dialog-footer&q…

【KWDB 2025 創作者計劃】_KWDB時序數據庫特性及跨模查詢

一、概述 數據庫的類型多種多樣&#xff0c;關系型數據庫、時序型數據庫、非關系型數據庫、內存數據庫、分布式數據庫、圖數據庫等等&#xff0c;每種類型都有其特定的使用場景和優勢&#xff0c;KaiwuDB 是一款面向 AIoT 場景的分布式、多模融合、支持原生 AI 的數據庫…