緩存 --- Redis性能瓶頸和大Key問題

緩存 --- Redis性能瓶頸和大Key問題

  • 內存瓶頸
  • 網絡瓶頸
  • CPU 瓶頸
  • 持久化瓶頸
  • 大key問題
    • 優化方案

  • Redis 是一個高性能的內存數據庫,但在實際使用中,可能會在內存、網絡、CPU、持久化、大鍵值對等方面遇到性能瓶頸。下面從這些方面詳細分析 Redis 的性能瓶頸,并給出相應的解決方法。

內存瓶頸

問題

  • Redis 是一個基于內存的數據庫,所有數據都存儲在內存中,因此內存容量是 Redis 的主要限制。
  • 當數據量超過可用內存時,Redis 可能會觸發內存淘汰策略(如 LRU、LFU),導致部分數據被刪除。
  • 大鍵值對(如大哈希表、大列表)會占用大量內存,進一步加劇內存壓力。

解決方法

  • 優化數據結構:使用更高效的數據結構(如壓縮列表、整數集合)來減少內存占用。
  • 啟用內存淘汰策略:根據業務需求配置合適的內存淘汰策略(如 volatile-lruallkeys-lru)。
  • 分片存儲:使用 Redis Cluster 將數據分布到多個節點,分散內存壓力。
  • 數據壓縮:在客戶端對數據進行壓縮后再存儲到 Redis 中。
  • 監控內存使用:定期監控 Redis 的內存使用情況,及時發現和解決內存問題。

網絡瓶頸

問題

  • Redis 的性能高度依賴于網絡,尤其是在高并發或跨地域部署的場景下。
  • 網絡延遲和帶寬限制會影響 Redis 的響應速度。
  • 大量小請求可能導致網絡擁塞,增加 Redis 的負載。

解決方法

  • 減少網絡請求:使用批量操作(如 MGETMSET)減少網絡請求次數。
  • 優化Redis客戶端連接池:配置合理的客戶端連接池,避免連接數過多或過少。
  • 使用內存緩存: 可考慮將一些數據量不大,并且對一致性要求不高的數據移至內存緩存
  • 就近部署:將 Redis 部署在離客戶端較近的位置,減少網絡延遲。
  • 監控網絡流量:定期監控 Redis 的網絡流量,及時發現和解決網絡瓶頸。

CPU 瓶頸

問題

  • Redis 的核心處理邏輯是單線程的(Redis 6.0 引入了多線程 I/O,但命令執行仍然是單線程的)。
  • 復雜命令(如 SORTZUNIONSTORE)或長耗時操作(如 KEYS *FLUSHALL)會占用大量 CPU 資源,阻塞其他命令的執行。

解決方法

  • 避免復雜命令:使用高效命令替代復雜命令(如 SCAN 替代 KEYS *)。
  • 使用多線程 I/O:在 Redis 6.0 及以上版本中,啟用多線程 I/O 提升網絡處理能力。
  • 分散計算邏輯:將復雜計算邏輯移到客戶端或應用層,減少 Redis 的 CPU 負擔。
  • 監控 CPU 使用率:定期監控 Redis 的 CPU 使用率,及時發現和解決 CPU 瓶頸。

持久化瓶頸

問題

  • Redis 提供了兩種持久化方式:RDB(快照)和 AOF(追加日志)。
  • RDB 在生成快照時可能會占用大量 CPU 和內存,導致性能下降。
  • AOF 的日志追加操作會增加磁盤 I/O 壓力,尤其是在高寫入場景下。

解決方法

  • 選擇合適的持久化方式:根據業務需求選擇合適的持久化方式(如 RDB 適合備份,AOF 適合數據安全)。
  • 調整持久化配置:優化 RDB 和 AOF 的配置(如 save 參數、appendfsync 參數)以平衡性能和數據安全。
  • 使用混合持久化:在 Redis 4.0 及以上版本中,啟用混合持久化(RDB + AOF)以兼顧性能和數據安全。
  • 監控持久化性能:定期監控 Redis 的持久化性能,及時發現和解決持久化瓶頸。

大key問題

大key定義:

  • 所謂的大key問題是某個key的value比較大,所以本質上是大value問題
  • String類型的Key,它的值為5MB(數據過大)
  • List類型的Key,它的列表數量為20000個(列表數量過多)
  • ZSet類型的Key,它的成員數量為10000個(成員數量過多)
  • Hash格式的Key,它的成員數量雖然只有1000個但這些成員的value總大小為100MB(成員體積過大)
  • 在實際業務中,大Key的判定仍然需要根據Redis的實際使用場景、業務場景來進行綜合判斷。通常都會以數據大小與成員數量來判定。
  • 一般認為string類型控制在10KB以內,hash、list、set、zset元素個數不要超過10000個。

大 Key 的問題

  • 內存占用過高:
    大 Key 會占用大量內存,可能導致 Redis 內存不足,觸發內存淘汰策略(如 LRU、LFU),甚至導致 OOM(Out Of Memory)錯誤。
  • 網絡以及操作性能下降:
    對大 Key 的操作(如 HGETALL、LRANGE、SMEMBERS)會消耗大量 CPU 和網絡資源,導致 Redis 響應變慢。
  • 大 Key 的操作可能會阻塞 Redis 的單線程模型,影響其他命令的執行。
  • 持久化性能問題:
    在生成 RDB 快照或 AOF 日志時,大 Key 會導致持久化操作變慢,增加 Redis 的負載。
    數據遷移困難:
    在 Redis Cluster 中,大 Key 的數據遷移會占用大量網絡帶寬,影響集群的穩定性。
  • 故障恢復時間長:
    如果 Redis 實例發生故障,大 Key 的恢復時間會顯著增加,影響服務的可用性。

大key的產生:

  • 大key的產生往往是業務方設計不合理,沒有預見vaule的動態增長問題
  • redis數據結構使用不合理,易造成Key的value過大,如使用String類型的Key存放大體積二進制文件型數據
  • 業務上線前規劃設計不足,沒有對Key中的成員進行合理的拆分,造成個別Key中的成員數量過多
  • 沒有對無效數據進行定期清理,造成如HASH類型Key中的成員持續不斷的增加。即一直往value塞數據,卻沒有刪除機制,value只會越來越大
  • 在實際業務中,可能會發生的大key場景:
  • 社交類:粉絲列表,如果某些明星或者大v不精心設計下,必是bigkey;
  • 統計類:例如按天存儲某項功能或者網站的用戶集合,除非沒幾個人用,否則必是bigkey;
  • 緩存類:將數據從數據庫load出來序列化放到Redis里,這個方式非常常用,但有兩個地方需要注意,第一,是不是有必要把所有字段都緩存,第二,有沒有相關關聯的數據。

優化方案

刪除大key

  • 首先考慮刪除大key,如果發現某些大key并非熱key就可以在DB中查詢使用,則可以在Redis中刪掉:
  • Redis 4.0及之后版本:您可以通過UNLINK命令安全地刪除大Key甚至特大Key,該命令能夠以非阻塞的方式,逐步地清理傳入的Key。 Redis UNLINK 命令類似與 DEL 命令,表示刪除指定的 key,如果指定 key 不存在,命令則忽略。 UNLINK 命令不同與 DEL
    命令在于它是異步執行的,因此它不會阻塞。 UNLINK 命令是非阻塞刪除,非阻塞刪除簡言之,就是將刪除操作放到另外一個線程去處理。
  • Redis 4.0之前的版本:建議先通過SCAN命令讀取部分數據,然后進行刪除,避免一次性刪除大量key導致Redis阻塞。 Redis Scan 命令用于迭代數據庫中的數據庫鍵。 SCAN 命令是一個基于游標的迭代器,每次被調用之后, 都會向用戶返回一個新的游標,
    用戶在下次迭代時需要使用這個新游標作為 SCAN 命令的游標參數, 以此來延續之前的迭代過程。

壓縮大key

  • 可以采用壓縮法, 考慮到使用合適的序列化框架、壓縮算法:
  • 當vaule是string時,比較難拆分,則使用序列化、壓縮算法將key的大小控制在合理范圍內,但是序列化和反序列化都會帶來更多時間上的消耗, 如果壓縮之后仍然是大key,則需要考慮進行拆分

拆分大key

  • 將一個Big Key拆分為多個key-value這樣的小Key,并確保每個key的成員數量或者大小在合理范圍內,然后再進行存儲,通過get不同的key或者使用mget批量獲取。
  • 當value是list/set等集合類型時,根據預估的數據規模來進行分片,不同的元素計算后分到不同的片

本地緩存(Caffeine )

  • 可以考慮本地緩存(Caffeine )》Redis》數據庫

Case Study
某電商平臺的商品評論數據存儲在 Redis 中,使用列表(List)數據結構存儲每個商品的評論 ID。由于某些熱門商品的評論數量高達數百萬條,導致這些商品的評論列表成為大 Key,引發以下問題:

  • 內存占用過高,導致 Redis 內存不足。
  • 獲取評論列表(LRANGE)時,響應時間過長。
  • 持久化操作變慢,影響 Redis 的性能。

將每個商品的評論列表拆分為多個小列表

  • 例如:將商品 A 的評論列表拆分為 product:A:comments:1、product:A:comments:2、…、product:A:comments:N,每個小列表存儲 1 萬條評論。
  • 在客戶端或應用層實現分頁邏輯,按需獲取評論列表
  • 將評論列表從列表(List)改為有序集合(ZSet),以支持按時間排序和分頁查詢

限制 Key 的大小:

  • 在寫入評論時,檢查評論列表的大小,如果超過閾值(如 1 萬條),則創建新的小列表。

定期清理大 Key:

  • 使用 SCAN 命令定期掃描 Redis 中的大 Key,并進行清理或拆分。

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

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

相關文章

Python爬蟲與代理IP:高效抓取數據的實戰指南

目錄 一、基礎概念解析 1.1 爬蟲的工作原理 1.2 代理IP的作用 二、環境搭建與工具選擇 2.1 Python庫準備 2.2 代理IP選擇技巧 三、實戰步驟分解 3.1 基礎版:單線程免費代理 3.2 進階版:多線程付費代理池 3.3 終極版:Scrapy框架自動…

Nginx HTTP 414 與“大面積”式洪水攻擊聯合防御實戰

一、引言 在大規模分布式應用中,Nginx 常作為前端負載均衡和反向代理服務器。攻擊者若結合超長 URI/頭部攻擊(觸發 HTTP 414)與海量洪水攻擊,可在網絡層與應用層形成雙重打擊:一方面耗盡緩沖區和內存,另一…

【上位機——MFC】運行時類信息機制

運行時類信息機制的使用 類必須派生自CObject類內必須添加聲明宏DECLARE_DYNAMIC(theClass)3.類外必須添加實現宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具備上述三個條件后&#xff0c;CObject::IsKindOf函數就可以正確判斷對象是否屬于某個類。 代碼示例 #include <…

Maven插件管理的基本原理

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

卷積神經網絡--手寫數字識別

本文我們通過搭建卷積神經網絡模型&#xff0c;實現手寫數字識別。 pytorch中提供了手寫數字的數據集 &#xff0c;我們可以直接從pytorch中下載 MNIST中包含70000張手寫數字圖像&#xff1a;60000張用于訓練&#xff0c;10000張用于測試 圖像是灰度的&#xff0c;28x28像素 …

大文件分片上傳進階版(新增md5校驗、上傳進度展示、并行控制,智能分片、加密上傳、斷點續傳、自動重試),實現四位一體的網絡感知型大文件傳輸系統?

上篇文章我們總結了大文件分片上傳的主要核心&#xff0c;但是我對md5校驗和上傳進度展示這塊也比較感興趣&#xff0c;所以在deepseek的幫助下&#xff0c;擴展了一下我們的代碼&#xff0c;如果有任何問題和想法&#xff0c;非常歡迎大家在評論區與我交流&#xff0c;我需要學…

C# 點擊導入,將需要的參數傳遞到彈窗的頁面

點擊導入按鈕&#xff0c;獲取本頁面的datagridview標題的結構&#xff0c;并傳遞到導入界面。 新增一個datatable用于存儲datagridview的caption和name&#xff0c;這里用的是devexpress組件中的gridview。 DataTable dt new DataTable(); DataColumn CAPTION …

android的 framework 是什么

Android的Framework&#xff08;框架&#xff09;是Android系統的核心組成部分&#xff0c;它為開發者提供了一系列的API&#xff08;應用程序編程接口&#xff09;&#xff0c;使得開發者能夠方便地創建各種Android應用。以下是關于它的詳細介紹&#xff1a; 位置與架構 在A…

【MySQL】表的約束(主鍵、唯一鍵、外鍵等約束類型詳解)、表的設計

目錄 1.數據庫約束 1.1 約束類型 1.2 null約束 — not null 1.3 unique — 唯一約束 1.4 default — 設置默認值 1.5 primary key — 主鍵約束 自增主鍵 自增主鍵的局限性&#xff1a;經典面試問題&#xff08;進階問題&#xff09; 1.6 foreign key — 外鍵約束 1.7…

數據結構-C語言版本(三)棧

數據結構中的棧&#xff1a;概念、操作與實戰 第一部分 棧分類及常見形式 棧是一種遵循后進先出(LIFO, Last In First Out)原則的線性數據結構。棧主要有以下幾種實現形式&#xff1a; 1. 數組實現的棧&#xff08;順序棧&#xff09; #define MAX_SIZE 100typedef struct …

如何以特殊工藝攻克超薄電路板制造難題?

一、超薄PCB的行業定義與核心挑戰 超薄PCB通常指厚度低于1.0毫米的電路板&#xff0c;而高端產品可進一步壓縮至0.4毫米甚至0.2毫米以下。這類電路板因體積小、重量輕、熱傳導性能優異&#xff0c;被廣泛應用于折疊屏手機、智能穿戴設備、醫療植入器械及新能源汽車等領域。然而…

AI 賦能 3D 創作!Tripo3D 全功能深度解析與實操教程

大家好&#xff0c;歡迎來到本期科技工具分享&#xff01; 今天要給大家帶來一款革命性的 AI 3D 模型生成平臺 ——Tripo3D。 無論你是游戲開發者、設計師&#xff0c;還是 3D 建模愛好者&#xff0c;只要想降低創作門檻、提升效率&#xff0c;這款工具都值得深入了解。 接下…

如何理解抽象且不易理解的華為云 API?

API的概念在華為云的使用中非常抽象&#xff0c;且不容易理解&#xff0c;用通俗的語言 形象的比喻來講清楚——什么是華為云 API&#xff0c;怎么用&#xff0c;背后原理&#xff0c;以及主要元素有哪些&#xff0c;盡量讓新手也能明白。 &#x1f9e0; 一句話先理解&#xf…

第 7 篇:總結與展望 - 時間序列學習的下一步

第 7 篇&#xff1a;總結與展望 - 時間序列學習的下一步 (圖片來源: Guillaume Hankenne on Pexels) 恭喜你&#xff01;如果你一路跟隨這個系列走到了這里&#xff0c;那么你已經成功地完成了時間序列分析的入門之旅。我們從零開始&#xff0c;一起探索了時間數據的基本概念、…

PPT無法編輯怎么辦?原因及解決方法全解析

在日常辦公中&#xff0c;我們經常會遇到需要編輯PPT的情況。然而&#xff0c;有時我們會發現PPT文件無法編輯&#xff0c;這可能由多種原因引起。今天我們來看看PPT無法編輯的幾種常見原因&#xff0c;并提供實用的解決方法&#xff0c;幫助你輕松應對。 原因1&#xff1a;文…

前端面試題---GET跟POST的區別(Ajax)

GET 和 POST 是兩種 HTTP 請求方式&#xff0c;它們在傳輸數據的方式和所需空間上有一些重要區別&#xff1a; ? 一句話概括&#xff1a; GET 數據放在 URL 中&#xff0c;受限較多&#xff1b;POST 數據放在請求體中&#xff0c;空間更大更安全。 &#x1f4e6; 1. 所需空間…

第 5 篇:初試牛刀 - 簡單的預測方法

第 5 篇&#xff1a;初試牛刀 - 簡單的預測方法 經過前面四篇的學習&#xff0c;我們已經具備了處理時間序列數據的基本功&#xff1a;加載、可視化、分解以及處理平穩性。現在&#xff0c;激動人心的時刻到來了——我們要開始嘗試預測 (Forecasting) 未來&#xff01; 預測是…

從代碼學習深度學習 - 學習率調度器 PyTorch 版

文章目錄 前言一、理論背景二、代碼解析2.1. 基本問題和環境設置2.2. 訓練函數2.3. 無學習率調度器實驗2.4. SquareRootScheduler 實驗2.5. FactorScheduler 實驗2.6. MultiFactorScheduler 實驗2.7. CosineScheduler 實驗2.8. 帶預熱的 CosineScheduler 實驗三、結果對比與分析…

k8s 基礎入門篇之開啟 firewalld

前面在部署k8s時&#xff0c;都是直接關閉的防火墻。由于生產環境需要開啟防火墻&#xff0c;只能放行一些特定的端口&#xff0c; 簡單記錄一下過程。 1. firewall 與 iptables 的關系 1.1 防火墻&#xff08;Firewall&#xff09; 定義&#xff1a; 防火墻是網絡安全系統&…

RSS 2025|蘇黎世提出「LLM-MPC混合架構」增強自動駕駛,推理速度提升10.5倍!

論文題目&#xff1a;Enhancing Autonomous Driving Systems with On-Board Deployed Large Language Models 論文作者&#xff1a;Nicolas Baumann&#xff0c;Cheng Hu&#xff0c;Paviththiren Sivasothilingam&#xff0c;Haotong Qin&#xff0c;Lei Xie&#xff0c;Miche…