Redis 的熱 Key(Hot Key)問題及解決方法

Redis 的熱 Key(Hot Key)問題及解決方法

1. 什么是 Redis 熱 Key?

Redis 熱 Key(Hot Key)指的是訪問頻率極高的 Key,通常會造成以下問題:

  • 單 Key 訪問量過大:熱點 Key 可能被高并發請求頻繁訪問,導致單點壓力集中,影響 Redis 的性能和穩定性。
  • CPU 負載過高:Redis 需要處理大量對同一 Key 的請求,導致 CPU 使用率急劇上升。
  • 網絡 IO 瓶頸:請求量過大可能會導致 Redis 服務器的網絡流量激增,影響整體響應速度。
  • 緩存穿透、緩存擊穿風險:如果熱 Key 過期或者未命中,可能導致大量請求直接打到數據庫,引發雪崩效應。

2. 如何發現熱 Key?

要優化 Redis 熱 Key 問題,首先需要找到這些 Key。可以使用以下方法:

(1)使用 Redis 自帶命令

  • `monitor`(不推薦線上使用):

    redis-cli monitor
    

    該命令會實時輸出所有 Redis 操作日志,可以用來觀察哪些 Key 被頻繁訪問。

  • `hotkeys`(適用于 Redis 7.0+)

    redis-cli hotkeys
    

    該命令直接列出熱點 Key,是 Redis 7.0 之后的新功能。

  • `info commandstats`

    redis-cli info commandstats
    

    該命令可以查看 Redis 命令的執行統計,比如 `get`、`set` 命令的執行次數,可以間接推測哪些 Key 訪問頻率較高。

(2)使用 Redis 統計日志

  • 開啟 Redis 慢查詢日志:
    CONFIG SET slowlog-log-slower-than 10000  # 記錄執行時間超過 10ms 的命令
    
    然后查看慢查詢日志:
    SLOWLOG GET 10
    
    觀察是否有特定 Key 被頻繁查詢。

(3)在應用層收集訪問數據

在業務代碼中增加訪問日志,例如使用 AOP 記錄 Redis 訪問日志,或者在 Redis 代理層(如 Twemproxy)收集 Key 的訪問情況。


3. Redis 熱 Key 可能帶來的問題

問題類型影響
CPU 負載高單 Key 訪問過多,Redis 線程 CPU 使用率高
網絡流量大Redis 可能面臨巨大的請求流量,影響網絡性能
數據庫壓力高如果熱點 Key 失效,可能導致數據庫訪問量暴增
業務響應變慢Redis 請求延遲增加,影響業務體驗

4. Redis 熱 Key 解決方案

針對 Redis 熱 Key 的問題,可以采取以下幾種優化策略:

(1)本地緩存 + Redis 緩存

適用于 熱點 Key 訪問頻繁且數據變動不頻繁 的場景。

  • 在應用服務器本地增加一層 Guava CacheCaffeineEhCache 作為短時緩存,避免每次都訪問 Redis。
  • 只在緩存未命中時再查詢 Redis。

示例:

LoadingCache<String, String> localCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).maximumSize(1000).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return redisClient.get(key);  // 從 Redis 加載}});

當數據更新時,主動刪除本地緩存:

localCache.invalidate("hot_key");

(2)使用多級緩存

適用于分布式集群環境,緩解單點壓力:

  • 第一級緩存(應用本地緩存)
  • 第二級緩存(Redis)
  • 第三級緩存(數據庫)

示例流程:

  1. 先查本地緩存(Guava Cache)。
  2. 本地緩存未命中,查 Redis。
  3. Redis 未命中,查詢數據庫并回填 Redis。

(3)Redis 讀寫分離(主從集群 + 讀從庫)

適用于 Redis 讀流量過高的場景

  • 部署 Redis 主從復制,讓多個從節點分擔讀壓力:
    slaveof <master-host> <master-port>
    
  • 使用 Redis 代理(如 Twemproxy、Codis)進行分流,讓讀請求優先訪問從節點。

(4)數據分片(Sharding)

適用于 Redis Key 訪問不均衡的場景

  • 將 Key 拆分成多個小 Key,分散訪問壓力:
    • 例如:`user:123:profile` 拆分成 `user:123:profile:1`,`user:123:profile:2`
  • 結合 Redis Cluster分片代理(Codis、Twemproxy) 讓數據均衡分布。

(5)設置合理的 Key 過期策略

適用于熱點 Key 頻繁訪問但過期后可能引發緩存擊穿

  • 采用 隨機過期時間,避免同時失效:
    EXPIRE hot_key $((60 + RANDOM % 30))
    
  • 采用 自動重建緩存
    • 在 Key 過期前,后臺線程提前刷新緩存。

(6)異步更新策略

適用于 緩存數據實時性要求不高,但訪問量極大 的情況:

  • 采用 異步寫入
    • 訪問 Redis 熱 Key 時,使用 消息隊列(如 Kafka、RabbitMQ) 讓后端批量更新數據,避免頻繁更新。

(7)熱點 Key 預熱

適用于 系統啟動或熱點數據突增的場景

  • 在應用啟動時,提前加載熱點數據到 Redis,減少初始訪問延遲。

示例:

redis-cli -x set hot_key < hot_data.json

5. Redis 熱 Key 解決方案對比

方案適用場景優缺點
本地緩存訪問頻繁但數據變動少低延遲,但數據一致性問題
多級緩存訪問量大,數據庫訪問量大讀性能高,但增加復雜度
讀寫分離讀多寫少的場景讀性能提升,但架構復雜
數據分片訪問集中在部分 Key負載均衡好,但實現復雜
Key 過期策略緩存擊穿風險高減少緩存穿透,但不適合頻繁變更數據
異步更新低實時性需求場景減少 Redis 負擔,但一致性受影響
預熱業務啟動或熱點突增預防熱點 Key 失效,但維護麻煩

6. 結論

  • 選擇合適的方案需要結合 業務場景、數據訪問模式 以及 Redis 架構 來做權衡。
  • 最佳實踐: 業務+架構結合優化,避免單點過載,提升系統穩定性! 🚀

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

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

相關文章

SSM東理咨詢交流論壇

&#x1f345;點贊收藏關注 → 添加文檔最下方聯系方式咨詢本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345; 項目視頻 js…

http的請求體各項解析

一、前言 做Java開發的人員都知道&#xff0c;其實我們很多時候不單單在寫Java程序。做的各種各樣的系統&#xff0c;不管是PC的 還是移動端的&#xff0c;還是為別的系統提供接口。其實都離不開http協議或者https 這些東西。Java作為編程語言&#xff0c;再做業務開發時&#…

gradle生命周期鉤子函數

文章目錄 0. 總結表格1. 構建初始階段gradle.settingsEvaluated()gradle.projectsLoaded() 2. 配置階段gradle.beforeProject()gradle.afterProject()gradle.projectEvaluated()gradle.afterEvaluate()gradle.taskGraph.whenReady 3. 執行階段gradle.taskGraph.beforeTaskgradl…

Qt Enter和HoverEnter事件

介紹 做PC開發的過程中或多或少都會接觸到鼠標的懸停事件&#xff0c;Qt中處理鼠標懸停有Enter和HoverEnter兩種事件 相同點 QEvent::Enter對應QEnterEvent&#xff0c;描述的是鼠標進入控件坐標范圍之內的行為&#xff0c;QEnterEvent可以抓取鼠標的位置&#xff1b;QEvent…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通過漏洞利用實現逃逸&#xff0c;主要分為以下兩種方式&#xff1a; 1、操作系統層面的內核漏洞 這是利用宿主機操作系統內核中的安全漏洞&#xff0c;直接突破容器的隔離機制&#xff0c;獲得宿主機的權限。 攻擊原理&#xff1a;容器本質上是通過 Linux 的…

如何優化深度學習模型來提高錯別字檢測準確率?

為了優化深度學習模型以提高錯別字檢測的準確率,可以從以下幾個方面入手: 1. 數據增強 數據增強是提高模型泛化能力的有效方法。通過在訓練數據中引入噪聲,模型可以學習到更多變的模式,從而提高對未見數據的識別能力。 刪除字符:以一定概率刪除文本中的一個字符。增加字…

二叉搜索樹中的搜索(力扣700)

首先介紹一下什么是二叉搜索樹。 二叉搜索樹是一個有序樹&#xff1a; 若它的左子樹不空&#xff0c;則左子樹上所有結點的值均小于它的根結點的值&#xff1b;若它的右子樹不空&#xff0c;則右子樹上所有結點的值均大于它的根結點的值&#xff1b;它的左、右子樹也分別為二叉…

pytest自動化測試 - 構造“預置條件”的幾種方式

<< 返回目錄 1 pytest自動化測試 - 構造“預置條件”的幾種方式 1.1 使用夾具構造預置條件 在夾具章節中&#xff0c;我們介紹了夾具的作用&#xff0c;其中一項就是構造預置條件。pytest.fixture裝飾器中如果測試數據使用yield返回&#xff0c;則yield前的語句為預置條…

微信小程序date picker的一些說明

微信小程序的picker是一個功能強大的組件&#xff0c;它可以是一個普通選擇器&#xff0c;也可以是多項選擇器&#xff0c;也可以是時間、日期、省市區選擇器。 官方文檔在這里 這里講一下date picker的用法。 <view class"section"><view class"se…

[java] 面向對象進階篇1--黑馬程序員

目錄 static 靜態變量及其訪問 實例變量及其訪問 靜態方法及其訪問 實例方法及其訪問 總結 繼承 作用 定義格式 示例 總結 子類不能繼承的內容 繼承后的特點 成員變量 成員變量不重名 成員變量重名 super訪問父類成員變量 成員方法 成員方法不重名 成員方法…

python3+TensorFlow 2.x 基礎學習(一)

目錄 TensorFlow 2.x基礎 1、安裝 TensorFlow 2.x 2、TensorFlow 2.x 基礎概念 2、1 Eager Execution 2、2 TensorFlow 張量&#xff08;Tensor&#xff09; 3、使用Keras構建神經網絡模型 3、1 構建 Sequential 模型 3、2 編譯模型 1、Optimizer&#xff08;優化器&a…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引發DDoS風險/OpenAI 代理工具即將發布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引發DDoS風險 德國安全研究員 Benjamin Flesch 發現了一個嚴重的安全漏洞&#xff1a;攻擊者可以通過向 ChatGPT API 發送一個 HTTP 請求&#xff0c;利用 ChatGPT 的爬蟲對目標網站發起 DDoS 攻擊。該漏洞源于 OpenAI 在處理…

openlava/LSF 用戶組管理腳本

背景 在openlava運維中經常需要自動化一些常規操作&#xff0c;比如增加用戶組以及組成員、刪除用戶組成員、刪除用戶組等。而openlava的配置文件需要手動修改&#xff0c;然后再通過badmin reconfig激活配置。因此開發腳本將手工操作自動化就很有必要。 通過將腳本中的User…

LLMs的星辰大海:大語言模型的前世今生

文章目錄 一. LLM 的演進&#xff1a;從規則到智能的躍遷 &#x1f4ab;1.1 語言模型的蹣跚起步 &#x1f476;1.2 RNN 與 LSTM&#xff1a;序列建模的嘗試 &#x1f9d0;1.3 Transformer 的橫空出世&#xff1a;自注意力機制的革命 &#x1f4a5;1.4 LLM &#xff1a;從預測到…

7-Zip高危漏洞CVE-2025-0411:解析與修復

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析與修復 免責聲明 本系列工具僅供安全專業人員進行已授權環境使用&#xff0c;此工具所提供的功能只為網絡安全人員對自己所負責的網站、服務器等&#xff08;包括但不限于&#xff09;進行檢測或維護參考&#xff0c;未經授權請勿利…

數據結構(精講)----樹(應用篇)

特性&#xff1a; 什么是樹&#xff1a; 樹(Tree)是(n>0)個節點的有限集合T&#xff0c;它滿足兩個條件&#xff1a; (1) 有且僅有一個特定的稱為根&#xff08;Root&#xff09;的節點。 (2) 其余的節點可以分為m&#xff08;m≥0&#xff09;個互不相交的有限集合T1、…

【動態規劃】--- 斐波那契數模型

Welcome to 9ilks Code World (??? ? ???) 個人主頁: 9ilk (??? ? ???) 文章專欄&#xff1a; 算法Journey &#x1f3e0; 第N個泰波那契數模型 &#x1f4cc; 題目解析 第N個泰波那契數 題目要求的是泰波那契數&#xff0c;并非斐波那契數。 &…

如何確保Spring單例Bean在高并發環境下的安全性?

在Spring中&#xff0c;單例Bean就像是一個“公共的水杯”&#xff0c;整個應用程序中的所有線程都會共享這一個實例。在大部分情況下&#xff0c;這沒什么問題&#xff0c;但如果多個線程同時想要修改這個“水杯”里的內容&#xff0c;就可能會出現問題了。 想象一下&#xff…

期刊審稿意見回復的LaTeX模板分享

下載網址 https://github.com/NeuroDong/Latex_for_review_comments 效果展示 分享內容 在學術寫作過程中&#xff0c;回復審稿意見是一個重要且繁瑣的環節。由于審稿人眾多&#xff0c;使用Word進行排版往往效率低下。為了提高效率&#xff0c;我在網上找到了一個LaTeX模板…

Vue 3 30天精進之旅:Day 03 - Vue實例

引言 在前兩天的學習中&#xff0c;我們成功搭建了Vue.js的開發環境&#xff0c;并創建了我們的第一個Vue項目。今天&#xff0c;我們將深入了解Vue的核心概念之一——Vue實例。通過學習Vue實例&#xff0c;你將理解Vue的基礎架構&#xff0c;掌握數據綁定、模板語法和指令的使…