Redis 數據傾斜

Redis 數據傾斜指的是在 Redis 集群模式下,數據(以及相應的訪問請求和負載)在各個分片(Shard)之間分布嚴重不均勻的現象。這會導致部分節點成為熱點或超載,而其他節點資源閑置,最終引發性能瓶頸、高延遲、內存溢出、主從切換失敗甚至節點宕機。

以下是 Redis 數據傾斜的常見原因、檢測方法以及解決方案:


📊 ?常見原因?

  1. ?鍵分布不均:??

    • ?哈希槽映射不均:?? Redis 集群使用 CRC16 算法計算鍵的哈希槽(Slot)。如果鍵的設計不合理,導致大量鍵被映射到同一個或少量幾個哈希槽中(這些槽恰好在同一節點)。
    • ?鍵名使用特定模式:?? 例如大量鍵使用相同的固定前綴 + 流水號(user:1000:order:1, user:1000:order:2...)。如果 CRC16 算法對這類前綴敏感,可能導致哈希槽集中。
    • ?哈希標簽(Hash Tag)濫用:?? Redis 允許用 {...} 定義哈希標簽,確保帶相同標簽的鍵分配到同一個槽。如果標簽過于集中或所有鍵都使用同一個標簽,所有數據會被打到一個節點上。正確使用能聚合數據,濫用則導致嚴重傾斜。
  2. ?大 Key(Big Key):??

    • 單個 Key 的大小遠超平均值(如幾百KB、幾MB甚至更大)。常見于:
      • 大字符串(大緩存對象、序列化數據)
      • 元素數量巨大的集合(Set/Hash/List/Sorted Set)
    • 這個大 Key 及其相關操作會消耗所在節點不成比例的內存、網絡帶寬和 CPU。
  3. ?熱 Key(Hot Key):??

    • 某個或某幾個特定 Key 的訪問頻率(QPS)遠高于其他鍵。即使數據大小正常,極高的并發訪問也會使其所在節點成為計算和網絡流量的瓶頸。
  4. ?配置或路由問題:??

    • 集群配置錯誤(如節點數少、槽分配不均)
    • 客戶端使用非集群感知的驅動或不正確路由邏輯

🔍 ?如何檢測數據傾斜?

  1. ?Redis 監控工具:??

    • ?Redis 自帶命令:??
      • CLUSTER NODES:查看所有節點信息、狀態、分配的哈希槽范圍。
      • CLUSTER SLOTS:詳細列出哈希槽與節點的映射關系。
      • INFO memory + INFO keyspace(在特定節點上執行):對比不同節點的 used_memory 和鍵數量。
      • MEMORY USAGE <key>(檢查特定 Key 的大小)
      • redis-cli --bigkeys(找出實例中的大 Key,需謹慎在線上使用,避免阻塞)
      • redis-cli --hotkeys(需要開啟 maxmemory-policy,找出訪問頻率高的 Key)
    • ?圖形化工具:??
      • ?RedisInsight? (官方可視化工具,強烈推薦)
      • ?Grafana + Prometheus?(配置 Redis Exporter)
      • 云服務商提供的監控控制臺(如阿里云、騰訊云的 Redis 監控)
  2. ?分析指標:??

    • 各節點的內存使用率(差異巨大)
    • 各節點的 CPU 使用率(某個節點持續高負載)
    • 各節點的網絡輸入/輸出流量(不均衡)
    • 各節點的鍵數量差異巨大
    • 慢查詢日志中高頻出現訪問特定 Key 的操作

🛠? ?解決數據傾斜的方案?

🔑 ?1. 解決鍵分布不均(哈希槽傾斜)??
  • ?優化鍵設計:??
    • 避免使用可能導致哈希沖突的單一固定前綴。
    • ?合理使用哈希標簽:?? ?只在需要將強關聯數據放在同一個節點時才使用 {tag},并確保標簽分散度高(例如,不要所有鍵都用 {user123})。
    • 引入隨機后綴或分散因子,使鍵名更加均勻。
  • ?集群擴容:?? 增加分片(主節點)數量。當節點數增加時,集群會自動重新分配哈希槽(需要遷移數據)。擴容是解決分布不均的根本方法。
  • ?手動遷移哈希槽(高級):??
    • 使用 CLUSTER SETSLOT <slot> IMPORTING <node-id>CLUSTER SETSLOT <slot> MIGRATING <node-id> 結合 MIGRATE 命令手動移動傾斜的槽到負載低的節點。?操作復雜且有風險,通常由自動化工具完成或在專業指導下進行。??
    • 云服務商通常提供在線擴容和槽遷移功能,操作更簡單安全。
?? ?2. 解決大 Key(Big Key)??
  • ?識別與拆分:??
    • 使用 --bigkeys 或內存分析找到大 Key。
    • ?拆分:??
      • 超大 Hash/Set:拆分成多個小的鍵(如 user:1000:profile:base, user:1000:profile:contact),通過組合讀取。
      • 超大 List:拆成多個列表或考慮使用多個 Key。
      • 超大 String:檢查是否可壓縮或拆分存儲(例如分段存儲)。
      • Sorted Set:考慮按分數范圍或業務維度拆分。
  • ?壓縮值:?? 對文本型內容使用壓縮算法(如 snappy, gzip)。
  • ?異步處理:?? 如果大 Key 的值不需要強實時性,可以考慮異步計算后存入。
  • ?選擇合適的結構:?? 避免濫用一種數據結構。
  • ?刪除/過期:?? 如果數據已無價值,及時清理或設置 TTL。
🔥 ?3. 解決熱 Key(Hot Key)??
  • ?本地緩存(Client-Side Caching):?? 在應用層(靠近業務邏輯的地方)對熱 Key 進行緩存(如 Guava Cache, Caffeine)。需注意緩存一致性問題(可通過 Redis Pub/Sub 或過期機制處理)。?這是解決讀熱 Key 最有效、成本最低的方案。??
  • ?增加副本:??
    • 如果熱 Key 主要是讀取操作,可以為熱點所在的主節點多掛幾個從節點分擔讀壓力。客戶端采用讀寫分離策略讀從庫。
    • ?注意:?? 寫操作仍需落到主節點,純寫熱 Key 仍需其他方法。
  • ?二級緩存:?? 在 Redis 層之前再增加一層緩存(例如另一組 Redis 實例/Memcached),專門存放這些熱 Key。復雜度較高。
  • ?使用代理分片/分片代理:??
    • 在 Redis 集群前架設代理層(如 Twitter 的 Twemproxy, Codis, 或云服務商的 Proxy 如阿里云 Tair、騰訊云 CKV),并在代理層實現熱 Key 的自動探測和復制分發(將單個熱 Key 的讀請求分發到集群中的多個節點,該 Key 的數據在這些節點上冗余存儲)。?這是解決極端熱 Key 的高階方案,會帶來額外的數據一致性和管理復雜性。??
  • ?數據冗余:?? 業務層將熱 Key 復制多份存儲在不同鍵名下(如 hotkey_v1, hotkey_v2 等),由客戶端隨機讀取或代理層分配。管理成本高。
  • ?優化查詢:?? 檢查是否可以優化減少對熱 Key 的訪問頻率。
?? ?4. 其他通用策略?
  • ?合理規劃集群大小:?? 根據預估的數據量和訪問量合理設置分片數量。
  • ?使用智能驅動:?? 確保客戶端使用集群感知的驅動(如 JedisCluster, Lettuce),能正確路由請求。
  • ?監控告警:?? 建立完善的集群監控和告警機制,及時發現傾斜跡象。
  • ?版本升級:?? 新版本 Redis 可能在數據分布算法上有優化。
  • ?使用云托管服務:?? 云服務商的 Redis PaaS 通常內置了更好的負載均衡、自動故障轉移、大 Key/熱 Key 探測和緩解建議等功能。

📌 ?總結?

  • ?診斷先行:?? 確定是鍵分布不均、大 Key 還是熱 Key(或組合)?? 導致傾斜,方法不同。
  • ?對癥下藥:??
    • ?分布不均/容量不足:優化鍵名設計 + 集群擴容是核心。
    • ?大 Key:找出來,拆掉、壓縮或刪除。??
    • ?讀熱 Key:本地緩存 + 增加副本讀分離是首選。
    • ?寫熱 Key/極端熱 Key:考慮代理分片或二級緩存等復雜方案。??
  • ?預防為主:?? 設計階段關注鍵結構,避免大 Key,監控常態化。

數據傾斜是分布式系統的常見挑戰,關鍵在于結合 Redis 集群的特性、具體業務場景和監控指標,選擇最合適的組合方案進行治理。💡

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

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

相關文章

Java基礎-TCP通信(多發多收和一發一收)

目錄 案例要求&#xff1a; 實現思路&#xff1a; 代碼&#xff1a; User:客戶端 Client:服務端 總結&#xff1a; 案例要求&#xff1a; 實現TCP通信的多發多收和一發一收,多發多收去掉各自的while循環就是一發一收,本文只模擬一發一收 實現思路&#xff1a; 客戶端(U…

WinForm 對話框的 Show 與 ShowDialog:阻塞與非阻塞的抉擇

目錄 核心概念&#xff1a;阻塞與非阻塞 Show 與 ShowDialog 的詳細對比 代碼示例&#xff1a;兩種方式的實現差異 使用 Show () 顯示非模態對話框 使用 ShowDialog () 顯示模態對話框 適用場景分析 適合使用 Show () 的場景 適合使用 ShowDialog () 的場景 最佳實踐與…

曉知識: 動態代理與靜態代理的區別

動態代理與靜態代理的區別 代理模式是一種常見的設計模式&#xff0c;用于在不修改原始類的情況下擴展其功能。代理分為靜態代理和動態代理兩種&#xff0c;它們在實現方式、適用場景和靈活性上有顯著差異。 靜態代理 靜態代理在編譯時就已經確定代理類和被代理類的關系。代理類…

Linux系統編程Day9 -- gdb (linux)和lldb(macOS)調試工具

往期內容回顧 Git 教程&#xff08;初階&#xff09; 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具&#xff08;yum與vim&#xff09; 一、 Linux 下的調試工具 GDB 一、為什么要學習 GDB&#xff1f; 調試是開發…

數據結構(17)排序(下)

一、計數排序計數排序又稱為鴿巢原理&#xff0c;是對哈希直接定址法的變形應用。操作步驟如下&#xff1a;①統計相同元素出現的次數 ②根據統計的結果將序列回收到原來的序列中比如&#xff0c;現在有一個數組{6,1,2,9,4,2,4,1,4}。該數組中&#xff0c;元素1出現兩次&#…

深度解析 Spring Boot 循環依賴:原理、源碼與解決方案

在 Spring Boot 開發中,循環依賴是一個常見且容易被忽視的技術點。當兩個或多個 Bean 相互引用時,就會形成循環依賴(如 A 依賴 B,B 依賴 A)。初學者往往會困惑:Spring 為什么能自動處理這種看似矛盾的依賴關系?本文將從原理、源碼實現到解決方案,全方位剖析 Spring Boo…

數據庫的基本操作(約束與DQL查詢)

一、約束約束是在表上強制執行的數據規則&#xff0c;用于確保數據的完整性和一致性&#xff08;1&#xff09;約束類型MySQL中支持多種約束類型&#xff1a;①主鍵約束&#xff08;PRIMARY KEY&#xff09; ②自增約束&#xff08;AUTO_INCREMENT&#xff09;③非空約束…

HP Pavilion G6 筆記本安裝Ubuntu開機后自動進入飛行模式的問題解決

問題一臺HP Pavilion G6 筆記本 &#xff0c;安裝了Ubuntu24.04版本&#xff0c;開機后&#xff0c;直接進入飛行模式&#xff0c;導致無法使用Wifi,且使用fnf10的組合鍵&#xff0c;也無法關閉飛行模式。使用fnf10鍵&#xff0c;可以看到提示顯示飛行模式&#xff0c;但無法關…

LLM:MoE原理與實現探索

文章目錄前言一、Deepseek Moe二. Moe架構1. Expert2. Gate3. MoE Module三、Auxiliary Loss總結前言 MoE&#xff08;Mixture of Experts) 已經逐漸在LLM中廣泛應用&#xff0c;其工程部署相關目前也有了越來越多的支持&#xff0c;本文主要記錄一下MoE的基本模塊構造與原理。…

基于領域事件驅動的微服務架構設計與實踐

引言&#xff1a;為什么你的微服務總是"牽一發而動全身"&#xff1f; 在復雜的業務系統中&#xff0c;你是否遇到過這樣的困境&#xff1a;修改一個訂單服務&#xff0c;卻導致支付服務異常&#xff1b;調整庫存邏輯&#xff0c;用戶服務開始報錯。這種"蝴蝶效應…

如何使用curl編程來下載文件

libcurl 是一個功能強大的跨平臺網絡傳輸庫&#xff0c;支持多種協議。 本篇來介紹libcul的C語言編程&#xff0c;實現一個文件下載的功能。 1 curl基礎介紹 1.1 核心數據結構 1.1.1 CURL句柄 CURL是libcurl 的核心句柄&#xff0c;每個請求對應一個 CURL 實例&#xff0c;…

大語言模型提示工程與應用:ChatGPT提示工程技術指南

ChatGPT提示工程 學習目標 在本課程中&#xff0c;我們將學習更多關于ChatGPT的最新提示工程技術。 相關知識點 ChatGPT提示工程 學習內容 1 ChatGPT提示工程 ChatGPT是OpenAI研發的新型對話模型&#xff0c;具備多輪對話能力。該模型通過人類反饋強化學習(RLHF)訓練&am…

能力評估:如何系統評估你的技能和經驗

能力評估&#xff1a;如何系統評估你的技能和經驗 作為一名38歲的互聯網研發老兵&#xff0c;你已經積累了豐富的經驗&#xff0c;包括技術深度、項目管理、團隊協作等。但能力評估不是一次性事件&#xff0c;而是持續過程&#xff0c;幫助你識別優勢、短板&#xff0c;并為職業…

鴻蒙開發中所有自定義裝飾器的完整案例解析--涵蓋 16 個核心裝飾器的詳細用法和實戰場景

以下是鴻蒙開發中 所有自定義裝飾器的完整案例解析 和 終極總結指南&#xff0c;涵蓋 16 個核心裝飾器的詳細用法和實戰場景&#xff1a; 一、終極總結表&#xff1a;16大裝飾器全景圖 裝飾器類別V1V2核心作用典型場景Component組件定義??創建標準組件業務UI組件ComponentV2…

【C++】哈希表的實現(unordered_map和unordered_set的底層)

文章目錄 目錄 文章目錄 前言 一、unordered_set和unordered_map介紹 二、哈希表的介紹 三、哈希沖突的解決方法 1.開放定址法 2.鏈地址法 四、兩種哈希表代碼實現 總結 前言 前面我們學習了紅黑樹&#xff0c;紅黑樹就是map和set的底層&#xff0c;本篇文章帶來的是unordered…

歐拉公式的意義

歐拉公式的意義 歐拉公式&#xff08;Euler’s Formula&#xff09;是數學中最重要的公式之一&#xff0c;它將復數、指數函數和三角函數緊密聯系在一起。其基本形式為&#xff1a; eiθcos?θisin?θ e^{i\theta} \cos \theta i \sin \theta eiθcosθisinθ 當 θπ\thet…

Linux Docker 運行SQL Server

在Linux操作系統&#xff0c;已安裝docker&#xff0c;現在以docker compose方式&#xff0c;安裝一個最新版SQL Server 2022的數據庫。 # 建個目錄&#xff08;請不要照抄&#xff0c;我的數據盤在/data&#xff0c;你可以改為/opt&#xff09; mkdir /data/sqlserver# 進入目…

C++:stack_queue(2)實現底層

文章目錄一.容器適配器1. 本質&#xff1a;2. 接口&#xff1a;3. 迭代器&#xff1a;4. 功能&#xff1a;二.deque的簡單介紹1.概念與特性2.結構與底層邏輯2.1 雙端隊列&#xff08;deque&#xff09;結構&#xff1a;2.2 deque的內部結構2.3 deque的插入與刪除操作&#xff1…

Lightroom 安卓版 + Windows 版 + Mac 版全適配,編輯管理一站式,專業攝影后期教程

軟件是啥樣的? Adobe Lightroom 這軟件&#xff0c;在安卓手機、Windows 電腦和 Mac 電腦上都能用。不管是喜歡拍照的人&#xff0c;還是專門搞攝影的&#xff0c;用它都挺方便&#xff0c;能一站式搞定照片編輯、整理和分享這些事兒。 ****下載地址 分享文件&#xff1a;【Li…

office卸載不干凈?Office356卸載不干凈,office強力卸載軟件下載

微軟官方認可的卸載工具&#xff0c;支持徹底清除Office組件及注冊表殘留。需要以管理員身份運行&#xff0c;選擇“移除Office”功能并確認操作。 Office Tool Plus安裝地址獲取 點擊這里獲取&#xff1a;Office Tool Plus 1、雙擊打開軟件 image 2、選擇左右的工具箱&…