Redis的阻塞

Redis的阻塞

Redis的阻塞問題主要分為內在原因外在原因兩大類,以下從這兩個維度展開分析:


一、內在原因

1. 不合理使用API或數據結構
  • Redis 慢查詢

    • Redis 慢查詢的界定

      • 定義:Redis 慢查詢指命令執行時間超過預設閾值(默認 10ms)的操作,僅統計命令執行階段耗時
      • ?slowlog-log-slower-than?:閾值(單位微秒),默認 10000(10ms),建議調整為 1000(1ms)
      • ?slowlog-max-len?:慢查詢日志隊列長度,默認 128,建議提升至 1000+ 避免日志覆蓋。
    • 典型慢查詢命令及風險場景

      • 高時間復雜度命令(O(N)及以上)

        • 全量遍歷類

          • ?KEYS *?:遍歷所有鍵(復雜度 O(n)),可能引發長時間阻塞。
          • ?SMEMBERS?:獲取集合全部元素(O(n)),百萬級數據時耗時顯著。
        • 聚合計算類

          • ?SORT?:排序操作(O(n log n)),大列表排序時性能驟降。
          • ?ZUNIONSTORE?/SUNION?:多集合交并操作(O(n)),數據量越大耗時越長。
        • 大范圍查詢類

          • ?HGETALL?:獲取哈希所有字段(O(n)),10MB+ 的 Hash 操作延遲顯著。
          • ?LRANGE 0 -1?:獲取列表全部元素(O(n)),可能占用主線程數秒。
        1. BigKey 操作
        • 定義:存儲大量數據的 Key(如 10MB Hash、百萬元素 List)

        • 典型風險命令

          • ?DEL?:刪除 BigKey 時觸發內存回收阻塞(單線程模型下耗時極長)。
          • ?GET?/SET?:序列化/反序列化大 Value 時耗時增加(如 AOF 重寫階段)。
          • ?EXPIRE?:對大 Key 設置過期時間可能引發后續淘汰阻塞。
      • 非顯式高耗時操作

        • Pipeline 不當使用:一次性發送過多命令導致單次執行時間超過閾值。
        • Lua 腳本阻塞:執行復雜腳本(如循環遍歷大數據)時未分批次處理。
        • 事務(MULTI/EXEC) :事務中包含多個高耗時命令時整體被視為慢查詢。
    • 排查與優化建議

      • 查看日志

        SLOWLOG GET [n]  # 獲取最近 n 條慢查詢記錄(含命令、耗時、客戶端 IP)
        SLOWLOG LEN       # 統計當前日志數量
        

        ?

      • 日志字段解析

        • ?id?:唯一標識
        • ?timestamp?:執行時間戳
        • ?duration?:耗時(微秒)
        • ?command?:完整命令及參數。
      • 優化策略

        • 拆分 BigKey

          • 將大 Hash 拆分為多個子 Key,通過分片降低單次操作負載。
          • 使用 LPOP?/RPOP? 分批次刪除大 List,避免 DEL? 阻塞。
        • 配置調優

          • 動態調整閾值:CONFIG SET slowlog-log-slower-than 1000?。
          • 禁用高風險命令:通過 rename-command? 屏蔽 KEYS?。
        • 替換高復雜度命令

          • SCAN? 替代 KEYS?,HSCAN? 替代 HGETALL?。
          • 對排序需求改用 ZRANGE? 或客戶端計算。
      • 監控與預警

        • 工具

          • ?redis-cli --bigkeys?:掃描內存中的 BigKey。
          • Prometheus + Grafana:可視化監控慢查詢頻率及耗時分布。
        • 告警規則

          • 單命令耗時 > 5ms 時觸發告警。
          • 慢查詢日志長度連續增長時排查潛在性能瓶頸。

        ?

    • 總結:慢查詢命令速查表

      命令類型典型命令風險場景優化方案
      全量遍歷?KEYS *?、SMEMBERS?鍵數量多、集合元素量大改用SCAN?、分片存儲
      聚合計算?SORT?、ZUNIONSTORE?數據量大、多集合操作客戶端計算、預聚合
      大范圍查詢?HGETALL?、LRANGE 0 -1?Hash/List 體積大分批次獲取、壓縮存儲格式
      BigKey 操作?DEL?、GET?(大 Value)內存回收、序列化開銷漸進式刪除、拆分 Key
2. CPU飽和
  • CPU飽和的定義 :

    • CPU飽和指Redis單核CPU使用率長期接近或達到100%的臨界狀態。由于Redis采用單線程模型,所有請求由主線程順序處理,一旦CPU滿載會導致命令隊列積壓、響應延遲暴增,甚至引發服務雪崩。這種現象在高并發或復雜操作場景下尤為危險
  • 判斷并發量是否達極限

    • ?redis-cli --stat?命令分析 每秒輸出一次統計信息,重點關注requests?字段(即OPS,每秒操作數)

      redis-cli --stat
      # 典型CPU飽和時的輸出特征:
      # 1. 每秒處理請求量持續在5萬+(普通服務器極限約8-10萬OPS)
      # 2. 客戶端連接數(clients)持續高位且無明顯波動
      

      ?

    • ?top?命令監控 直接觀察Redis進程的CPU使用率

      top -p $(pgrep redis-server)
      # 當CPU使用率≥95%且持續不降時,可判定為飽和狀態
      
    • ?INFO commandstats?分析命令耗時 觀察高頻命令的usec_per_call?(單次調用微秒數

      cmdstat_hset:calls=198757512,usec=27021957243,usec_per_call=135.95
      # 正常O(1)命令應≤10微秒,若值異常高(如135μs)可能存在配置或數據結構問題
      
  • 問題根源分析

    • 高算法復雜度命令

    • 過度內存優化

      • 修改hash-max-ziplist-entries?等參數過度壓縮數據結構,導致操作復雜度從O(1)退化為O(n)
    • 持久化操作競爭

      • Fork阻塞
      • AOF刷盤
    • 連接數過載 : 短連接頻繁創建或maxclients?設置過低,導致TCP握手/斷連消耗CPU資源

3. 持久化阻塞
  • RDB生成BGSAVE?觸發fork操作時,若內存過大(如10GB),復制頁表可能導致主線程暫停(典型耗時約20ms/GB)。

  • AOF重寫BGREWRITEAOF?期間,主線程需將緩沖區數據追加到新AOF文件,可能因磁盤壓力大而阻塞。

    • 優化方案

      • 調整RDB觸發頻率,避免高峰期執行。
      • 使用appendfsync everysec?替代always?,降低磁盤I/O壓力。
      • 關閉透明大頁(THP),避免內存頁復制效率降低。

二、外在原因

1. CPU競爭
  • Redis部署在多核服務器時,若與其他進程競爭CPU資源,或父子進程(如RDB/AOF重寫)綁定同一核心,會導致性能下降。

    • 優化方案

      • 將Redis部署在專用服務器,避免資源爭搶。

      • 調整進程綁定策略(如父進程與子進程綁定不同核心)。

        • 錯誤的現象 :

          flowchart TDsubgraph CPU核心1A[Redis主線程\n(父進程)]B[RDB/AOF子進程]endA -->|fork| BA -->|處理客戶端請求\n(高優先級)| C[CPU時間片]B -->|生成快照/重寫AOF\n(低優先級)| CC -->|資源搶占| D[響應延遲增加]
          
        • 正確的現象

          flowchart TDsubgraph 物理CPUsubgraph 核心0-3A[Redis主線程\n(綁定核心0-3)]endsubgraph 核心4-7B[RDB/AOF子進程\n(綁定核心4-7)]endendA -->|fork| BA -->|獨占核心0-3| C[高效處理請求]B -->|獨占核心4-7| D[無干擾持久化]
          
2. 內存交換(Swap)
  • 內存交換是操作系統的內存管理機制,當物理內存不足時,系統會將部分內存中的冷數據(長時間未被訪問)移動到磁盤的 Swap 分區,以騰出內存空間給其他進程使用。
    對 Redis 而言,數據原本應完全駐留內存以實現高性能(微秒級響應)。若發生 Swap,訪問被換出的數據需經歷磁盤 I/O(毫秒級),響應延遲驟增 5~10 萬倍

  • 內存交換流程圖

    flowchart TDsubgraph 物理內存A[Redis 熱點數據\n(高頻訪問)]B[Redis 冷數據\n(長時間未訪問)]C[其他進程占用的內存]endsubgraph 磁盤Swap分區D[被換出的冷數據]endA -->|持續活躍| E[正常響應(微秒級)]B -->|內存不足觸發交換| F[Swap Out操作]F -->|數據寫入磁盤| DC -->|占用內存增加| FD -->|再次被訪問| G[Swap In操作]G -->|數據加載回內存| H[高延遲響應(毫秒級)]
    
    • 流程關鍵點

      • 觸發條件(內存不足)

        • Redis 自身內存超限(如未設置 maxmemory?)
        • 同一服務器運行其他內存密集型進程(如大數據處理、文件 I/O)
      • Swap Out

        操作系統將冷數據從內存遷移到 Swap 分區,釋放物理內存空間。

      • Swap In

        Redis 需訪問已換出的數據時,觸發磁盤讀取和數據回遷,導致延遲暴增。

      • 性能影響

        單次 Swap 操作可能引入數毫秒延遲,若高頻觸發則整體吞吐量斷崖式下跌

  • 內存交換的核心原因

    • Redis 內存超限

      • 未配置 ?maxmemory??:Redis 默認無內存限制,可能無限增長直至觸發 Swap。
      • BigKey 或內存碎片:大對象(如 10MB Hash)或碎片化內存占用超出預期
    • 操作系統資源競爭

      • 多進程共存:同一服務器運行 MySQL、Hadoop 等內存密集型服務,擠占 Redis 可用內存。
      • Swap 配置不合理:Linux 默認 vm.swappiness=60?,內存壓力大時激進換出數據。
    • 硬件限制

      • 物理內存不足:服務器內存容量無法支撐 Redis 數據集規模
      • 磁盤性能差:機械硬盤的 Swap 操作延遲遠高于 SSD(如 10ms vs 0.1ms)。
  • 監控與診斷工具

    • 檢查 Swap 使用量

      # 查看 Redis 進程 Swap 情況
      redis-cli info | grep process_id  # 獲取 PID
      cat /proc/<PID>/smaps | grep -i swap
      
    • 性能分析工具

      • ?redis-cli --latency?:檢測 Redis 響應延遲波動。
      • ?vmstat ?:監控系統級 Swap I/O 頻率(si/so? 列)
3. 網絡問題
  • 連接數過多:短連接頻繁創建或maxclients?設置過低,導致TCP連接處理消耗CPU資源。

  • 帶寬不足:高吞吐場景下網絡打滿,或使用MONITOR?命令記錄所有請求。

    • 優化方案

      • 使用連接池管理長連接,設置timeout?自動關閉空閑連接。
      • 禁用MONITOR?,通過Pipeline?批量請求減少網絡往返。

三、總結與優化策略

阻塞類型關鍵表現優先級解決方案
大Key操作單命令執行時間過長拆分Key、改用分片或壓縮結構
持久化fork延遲?latest_fork_usec?值高降低RDB頻率、優化內存頁管理
CPU競爭服務器整體CPU飽和隔離部署、綁定CPU核心
內存交換?used_memory_rss?異常高緊急禁用Swap、增加物理內存

綜合建議

  • 監控工具:使用SLOWLOG?、INFO commandstats?分析慢查詢,redis-cli --bigkeys?掃描大Key。
  • 架構設計:采用讀寫分離、集群分片(Redis Cluster)分散負載。
  • 配置調優:調整maxmemory?、repl-backlog-size?,優化淘汰策略(如volatile-lru?)。

通過上述措施,可顯著降低Redis阻塞風險,提升系統穩定性。

?

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

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

相關文章

SLAM學習系列——ORB-SLAM3安裝(Ubuntu20-ROS/Noetic)

ORB-SLAM3學習&#xff08;Ubuntu20-ROS&#xff09; 0 主要參考文獻1 ORB-SLAM3安裝環境配置1.0 前言1.0.0 關于ORB-SLAM3安裝版本選擇1.0.1 本文配置操作匯總(快速配置)1.0.1.1 ORB_SLAM3環境配置&#xff1a;1.0.1.2 ORB_SLAM3安裝1.0.1.3 ORB_SLAM的ROS接口 1.1 C&#xff…

【應用密碼學】實驗二 分組密碼(2)

一、實驗要求與目的 1&#xff09; 學習AES密碼算法原理 2&#xff09; 學習AES密碼算法編程實現 二、實驗內容與步驟記錄&#xff08;只記錄關鍵步驟與結果&#xff0c;可截圖&#xff0c;但注意排版與圖片大小&#xff09; 字符串加解密 運行python程序&#xff0c;輸入…

區塊鏈基石解碼:分布式賬本的運行奧秘與技術架構

區塊鏈技術的革命性源于其核心組件——分布式賬本&#xff08;Distributed Ledger&#xff09;。這一技術通過去中心化、透明性和不可篡改性&#xff0c;重塑了傳統數據存儲與交易驗證的方式。本文將從分布式賬本的核心概念、實現原理、應用場景及挑戰等方面展開&#xff0c;揭…

AUTOSAR_RS_ClassicPlatformDebugTraceProfile

AUTOSAR經典平臺調試、跟蹤與分析支持 AUTOSAR組件調試、跟蹤與分析功能詳解 目錄 簡介ARTI核心擴展 核心特定ARTI擴展結構核心參數定義 操作系統和任務擴展 OS特定ARTI擴展任務特定ARTI擴展軟件組件特定擴展 總體架構 組件結構接口定義 錯誤處理 默認錯誤跟蹤器(DET) 總結 1.…

SpringBoot配置RestTemplate并理解單例模式詳解

在日常開發中&#xff0c;RestTemplate 是一個非常常用的工具&#xff0c;用來發起HTTP請求。今天我們通過一個小例子&#xff0c;不僅學習如何在SpringBoot中配置RestTemplate&#xff0c;還會深入理解單例模式在Spring中的實際應用。 1. 示例代碼 我們首先來看一個基礎的配置…

DPIN在AI+DePIN孟買峰會闡述全球GPU生態系統的戰略愿景

DPIN基金會在3月29日于印度孟買舉行的AIDePIN峰會上展示了其愿景和未來5年的具體發展計劃&#xff0c;旨在塑造去中心化算力的未來。本次活動匯集了DPIN、QPIN、社區成員和Web3行業資深顧問&#xff0c;深入探討DPIN構建全球領先的去中心化GPU算力網絡的戰略&#xff0c;該網絡…

央視兩次采訪報道愛藏評級,聚焦生肖鈔市場升溫,評級幣成交易安全“定心丸”

CCTV央視財經頻道《經濟信息聯播》《第一時間》兩檔節目分別對生肖賀歲鈔進行了5分鐘20秒的專題報道。長期以來&#xff0c;我國一直保持著發行生肖紀念鈔和紀念幣的傳統&#xff0c;生肖紀念鈔和紀念幣在收藏市場保持著較高的熱度。特別是2024年初&#xff0c;央行發行了首張賀…

【計算機哲學故事1-2】輸入輸出(I/O):你吸收什么,便成為什么

“我最近&#xff0c;是不是廢了……”她癱在沙發上&#xff0c;手機扣在胸口&#xff0c;盯著天花板自言自語。 我坐在一旁&#xff0c;隨手翻著桌上的雜志&#xff0c;沒接話&#xff0c;等著她把情緒發泄完。 果然&#xff0c;幾秒后&#xff0c;她重重地嘆了口氣&#xf…

封裝el-autocomplete,接口調用

組件 <template><el-autocompletev-model"selectedValue":fetch-suggestions"fetchSuggestions":placeholder"placeholder"select"handleSelect"clearablev-bind"$attrs"/> </template><script lang&…

GPUStack昇騰Atlas300I duo部署模型DeepSeek-R1【GPUStack實戰篇2】

2025年4月25日GPUStack發布了v0.6版本&#xff0c;為昇騰芯片910B&#xff08;1-4&#xff09;和310P3內置了MinIE推理&#xff0c;新增了310P芯片的支持&#xff0c;很感興趣&#xff0c;所以我馬上來搗鼓玩玩看哈 官方文檔&#xff1a;https://docs.gpustack.ai/latest/insta…

Linux進程詳細解析

1.操作系統 概念 任何計算機系統都包含?個基本的程序集合&#xff0c;稱為操作系統(OS)。籠統的理解&#xff0c;操作系統包括&#xff1a; ? 內核&#xff08;進程管理&#xff0c;內存管理&#xff0c;文件管理&#xff0c;驅動管理&#xff09; ? 其他程序&#xff08…

解決兩個技術問題后小有感觸-QZ Tray使用經驗小總結

老朋友都知道&#xff0c;我現在是一家軟件公司銷售部門的項目經理和全棧開發工程師&#xff0c;就是這么“奇怪”的崗位&#xff0c;大概我是公司銷售團隊里比較少有技術背景、銷售業績又不那么理想的銷售。 近期在某個票務系統項目上駐場&#xff0c;原來我是這個項目的項目…

Centos 7.6安裝redis-6.2.6

1. 安裝依賴 確保系統已經安裝了必要的編譯工具和庫&#xff1a; sudo yum groupinstall "Development Tools" -y sudo yum install gcc make tcl -y 2. 解壓 Redis 源碼包 進入 /usr/local/ 目錄并解壓 redis-6.2.6.tar.gz 文件&#xff1a; cd /usr/local/ sudo ta…

Ejs模版引擎介紹,什么是模版引擎,什么是ejs,ejs基本用法

** EJS 模板引擎**&#xff0c;讓你徹底搞明白什么是模板引擎、什么是 EJS、怎么用、語法、最佳實踐等等&#xff1a; &#x1f4da; 一、什么是模板引擎&#xff1f; 模板引擎是前后端分離之前的一種服務器端“渲染技術”。它的主要作用是&#xff1a; 將 HTML 頁面和后端傳遞…

2025.4.21-2025.4.26學習周報

目錄 摘要Abstract1 文獻閱讀1.1 模型架構1.1.1 動態圖鄰接矩陣的構建1.1.2 多層次聚合機制模塊1.1.3 AHGC-GRU 1.2 實驗分析 總結 摘要 在本周閱讀的論文中&#xff0c;作者提出了一種名為AHGCNN的自適應層次圖卷積神經網絡。AHGCNN通過將監測站點視為圖結構中的節點&#xf…

6.1 客戶服務:智能客服與自動化支持系統的構建

隨著企業數字化轉型的加速&#xff0c;客戶服務作為企業與用戶交互的核心環節&#xff0c;正經歷從傳統人工服務向智能化、自動化服務的深刻變革。基于大語言模型&#xff08;LLM&#xff09;和智能代理&#xff08;Agent&#xff09;的技術為構建智能客服與自動化支持系統提供…

java Optional

我還沒用過java8的一些語法&#xff0c;有點老古董了&#xff0c;記錄下Optional怎么用。 從源碼看&#xff0c;Optional內部持有一個對象&#xff0c; 有一些api對這個對象進行判空處理。 靜態方法of &#xff0c;生成Optional對象&#xff0c; 但這個value不能為空&#…

【Java面試筆記:進階】24.有哪些方法可以在運行時動態生成一個Java類?

在Java中,運行時動態生成類是實現動態編程、框架擴展(如AOP、ORM)和插件化系統的關鍵技術。 1.動態生成Java類的方法 1.從源碼生成 直接生成源碼文件:通過Java程序生成源碼并保存為文件。編譯源碼: 使用ProcessBuilder啟動javac進程進行編譯。使用Java Compiler API(ja…

基于Jamba模型的天氣預測實戰

深入探索Mamba模型架構與應用 - 商品搜索 - 京東 DeepSeek大模型高性能核心技術與多模態融合開發 - 商品搜索 - 京東 由于大氣運動極為復雜&#xff0c;影響天氣的因素較多&#xff0c;而人們認識大氣本身運動的能力極為有限&#xff0c;因此以前天氣預報水平較低 。預報員在預…

GAMES202-高質量實時渲染(Real-Time Shadows)

目錄 Shadow MappingshadowMapping的問題shadow mapping背后的數學PCF&#xff08;Percentage Closer Filtering&#xff09;PCSS&#xff08;Percentage closer soft shadows&#xff09;VSSM&#xff08;Variance Soft Shadow Mapping&#xff09;優化步驟3優化步驟1SAT&…