Redis不同場景下的注意事項

Redis常見的 使用場景:

  • 緩存系統(核心場景)
    • 存儲熱點數據,減少數據庫訪問壓力。提升接口響應速度。
    • 技術點:
      • 用String/Hash 存儲結構化數據
      • 結合過期時間(TTL)和緩存淘汰策略(如LRU)管理內存。
      • 解決緩存問題:穿透(布隆過濾器)、擊穿(互斥鎖)、雪崩(隨機過期時間)。
  • 計數器與限流
    • 實時統計高頻變動的值,或限制接口訪問訪問頻率。
    • 技術點:
      • 用String存儲單計數器(INCR )。
      • 用HASH存儲多維計數器(HINCRBY user:100 stats:likes 1)
      • 限流可結合Expire自動重置技術(如 INCR limit:ip:192.168.1.1 + EXPIRE … 60)。
  • 消息隊列
    • 實現簡單的異步通信,解耦生產者和消費者。
    • 技術點:
      • 用List模擬隊列:LPUSH(生產)+ RPOP(消費),或阻塞版本BRPOP避免空輪詢。
      • 缺點:無消息確認機制,需要結合確認機制,需結合AOF持久化減少丟失風險;高級需求(如延時隊列)需要額外設計。
  • 排行榜與實時排名
    • 作用:根據分數動態排序,商品銷量榜,用戶貢獻榜。
    • 技術點:
      • 用Sorted Set存儲:ZADD rank:game user:100 95(用戶 100 分數 95),ZRANGE rank:game 0 9 WITHSCORES 取前 10 名。
      • 支持分數自增(ZINCRBY),適合動態更新排名。
  • 分布式鎖
    • 作用:在分布式系統中保證臨界資源的互斥訪問(如庫存扣減、訂單創建)
    • 優化:使用Redisson框架,支持自動續期、公平鎖、可重入等高級特性。
  • 用戶行為分析
    • 記錄用戶行為狀態,快速統計群體特征。
    • 技術點:
      • 用BitMap存儲每日登錄狀態:SETBIT login:20201001 user:100 1(用戶100在20201001登錄)通過BITOP作位運算統計活躍用戶。
      • 用SET存儲用戶標簽:SADD tag:view:goods100 :100,通過交集(SINTER)找共同標簽用戶。
  • 地理信息服務
    • 作用:存儲地理位置,實現附近搜索,距離計算等功能;
    • 技術點:
      • 用Geospatial命令:GEOADD shops 116.40 39.90 shop:1 存儲經緯度,GEORADIUS shops 116.40 39.90 5 km 查找 5 公里內的商家。
  • 會話存儲
    • 作用:存儲用戶登錄狀態(如Session、Token),支持分布式系統共享會話。
    • 技術點:
      • 用String存儲Session/Token:SET session:user100 ”xxx“EX 7200(2小時過期)。
      • 結合EXPIRE自動銷毀過期會話,減輕服務器存儲壓力。

緩存場景

緩存關鍵問題:數據一致性、可用性、內存效率。同時規避緩存常見風險(如穿透、擊穿、雪崩)。

  1. 緩存穿透:避免”不存在的數據“,穿透到數據庫。
    問題本質:請求查詢 不存在的數據,導致緩存無法命中。所有請求都直接打到數據庫,導致數據庫壓力驟增。
    解決方案

    • 空值緩存:數據庫給查詢為空時,可以將空值存入緩存。并設置較短的過期時間。避免重復穿透。 惡意攻擊會導致內存膨脹。
    • 布隆過濾器:在緩存前加一層布隆過濾器,將數據庫中存在的key提前存入過濾器,請求先過過濾器。
    • 參數校驗:接口層直接攔截非法參數(如id<0,非預期格式的key),從源頭阻斷無效請求。
  2. 緩存擊穿:避免熱點key過期,導致數據庫瞬間過載。

    • 問題本質:某個高頻訪問的熱點key過期瞬間大量請求同時命中失效的緩存,全部穿透到數據庫,造成數據庫“瞬間峰值”。
    • 解決方式:
      • 互斥鎖(分布式鎖):緩存未命中時,只有一個請求能獲取鎖并查詢數據庫,其他請求自選等待(或直接返回默認值),避免“并發穿透。注意:鎖過期時間需要大于數據庫查詢時間,防止鎖提前釋放導致并發問題;同時注意避免死鎖。
      • 熱點key永不過期
        • 業務層不設置TTL,通過后臺定時任務(如Cron腳本主動更新(如每小時更新商品信息)。
        • 若數據需要實時更新,殼子啊數據變更時主動SET命令覆蓋緩存,而非TTL過期。
      • 過期時間錯開:對同類熱點key設置隨機過期時間(如基礎過期時間+5~8分鐘隨機值)。
  3. 緩存雪崩問題,避免大量key集體過期/集群宕機導致數據庫崩潰
    問題本質
    同一時間段內大量緩存key集中過期,請求全部穿透到數據庫。
    Redis緩存集群整體宕機,緩存層整體失效。所有請求直接打向數據庫。
    解決方法

    • 針對大量key同時過期:給每個key設置隨機過期時間。分散過期時間。
    • 針對集群宕機:
      • 緩存使用集群高可用
      • 多級緩存:在Redis之前使用本地緩存(如:Caffeine、GuavaCache),即使Redis宕機本地緩存也可以暫代部分請求,減輕數據庫壓力。
      • 熔斷降級:通過監控工具(如Prometheus+Grafana)實時檢測數據庫壓力。當壓力超過指定閾值時,出發熔斷(直接返回默認值或錯誤提示),避免數據庫崩潰。
      • 流量控制:結合網關做接口限流,限制單位時間內的請求量。

數據一致性

緩存與數據庫 盡量保持一致,避免緩存存舊數據,數據庫存新數據 的矛盾場景。

  1. 選擇合適的 更新策略
  2. 處理緩存更新失敗問題:
    • 若數據庫更新成功,但刪除緩存失敗,會導致緩存殘留舊數據。解決方案:
      • 重試機制:刪除緩存失敗后,通過 本地重試機制或消息隊列 異步重試(如將”刪除緩存任務存入隊列中,失敗后重新消費),確保緩存最終被刪除。
      • 版本號+時間戳:緩存中存儲“數據+版本號”,查詢時對比數據庫版本號,若緩存版本低則主動更新。

相關優化

Redis是內存數據庫,需合理管理內存,避免內存溢出 性能下降。

  1. 緩存key的設計:
    • 簡潔且唯一:用“業務前綴+唯一標識”格式(如user:session:1001、goods:detail:abc123)避免key沖突
    • 避免過長:key過長會增加內存占用。
    • 避免大量小key,大量零散的小key會浪費內存(如 user💯name、user💯age)建議使用Hash合并(如 user:100 {name: “xxx”, age: 20})。
  2. 合理配置淘汰策略:當Redis內存到達maxmemory閾值時,需通過淘汰策略釋放內存,避免OOM內存溢出。需根據業務選擇策略:
    • 核心策略推薦:
      • LRU:淘汰 最近最少使用的key(適合熱點數據場景,如商品詳情),對應配置 maxmemory-policy allkeys-lru(所有 key 中選 LRU)或 volatile-lru(只在設置了 TTL 的 key 中選 LRU)。
      • LFU:淘汰最近訪問頻率最低的key(適合長期低頻訪問數據,如歷史訂單)。對應配置:allkey-lfu或volatile-lfu。
    • 避免使用的策略:
      • noeviction(默認):內存滿時,直接拒絕寫請求,會導致業務報錯,除非是只讀場景。
      • random:隨即淘汰,可能淘汰熱點數據,不推薦。
  3. 控制緩存粒度與過期時間。
    • 緩存粒度不宜過粗過細:
      • 過粗:導致緩存數據冗余,更新世需全量替換,浪費帶寬和內存。
      • 過細:將對象每個屬性單獨存儲,導致 key數量增加,和查詢次數增多。
      • 建議:按“業務查詢維度”設計粒度,緩存對象采用聚合數據。
    • 過期時間合適

監控與運維

  • 核心指標:需要實時監控Redis的緩存命中率(目標>=95%),內存使用率、key過期數量、數據庫訪問量等。當指標異常時(如命中率驟降、內存超閾值) 及時告警。
    • 工具推薦:Prometheus+Grafana、Redis Insight。
  • 持久化配置:若緩存數據需要重啟后恢復(如熱點商品緩存),需要開啟AOF和RDB持久化‘
    • 優先使用AOF+RDB混合持久化。AOF保證數據不丟失(每秒刷盤),RDB用于數據快速恢復。
    • 若緩存數據可重建(如數據庫重新加載),可關閉持久化,減少IO操作。

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

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

相關文章

【完整源碼+數據集+部署教程】高速公路施工區域物體檢測系統源碼和數據集:改進yolo11-RepNCSPELAN

背景意義 隨著城市化進程的加快&#xff0c;高速公路建設與維護工作日益頻繁&#xff0c;施工區域的安全管理成為亟待解決的重要問題。在高速公路施工區域&#xff0c;工人和設備的安全是首要考慮因素&#xff0c;而有效的物體檢測系統能夠顯著提高施工現場的安全性與工作效率。…

如何在FastAPI中玩轉全鏈路追蹤,讓分布式系統故障無處遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全鏈路追蹤如何讓FastAPI微服務架構的每個請求都無所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全鏈路追蹤是現代微服務架構中監控系統行為的核心技術,通…

Win11 壓縮實測:Win11 的壓縮軟件的最佳配置和使用方式

文章目錄測試環境機器配置被壓縮文件WinRAR7zipLinux子系統準備極限壓縮減小字典的極限壓縮7zipWin11準備極限壓縮7zip系統內置右鍵壓縮菜單極限壓縮總結&#xff1a;Win11 的壓縮軟件的最佳配置和使用方式測試環境 機器配置 Win11系統 16GB內存 8核CPU 被壓縮文件 文件夾內…

CMake構建學習筆記22-libxml2庫的構建

在上一篇文章《CMake構建學習筆記21-通用的CMake構建腳本》中&#xff0c;筆者封裝了一個通用的cmake構建腳本cmake-build.ps1&#xff0c;那么這里筆者就嘗試通過這個腳本來構建libxml2庫。 libxml2是GNOME項目下的XML庫&#xff0c;雖然比不上TinyXML-2輕量&#xff0c;但是…

虛擬私有網絡筆記

VPN應用場景 ——VPN概述 ? 利用公共網絡來構建的私人專用網絡稱為虛擬私有網絡&#xff08;VPN&#xff0c; Virtual Private Network&#xff09;&#xff0c;用于構建VPN的公共網絡包括Internet 、幀中繼、ATM等。在公共網絡上組建的VPN象企業現有的私有網絡 一樣提供安全性…

Python 輕量級 HTML 解析器 - lxml入門教程

文章目錄初始化解析器路徑查找查找所有標簽查找指定 id 的標簽查找指定 class 的標簽查找包含指定 class 的標簽復雜路徑查找示例1示例2常見操作獲取所有標簽的鏈接獲取 div 標簽的文本內容, 其他標簽類似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成視頻擴散模型的多主體與動作定制化

VideoMage&#xff1a;文本生成視頻擴散模型的多主體與動作定制化 paper title&#xff1a;VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University發表在CVPR 2025的工作 Code:鏈接 圖1. 多主體與動作定制化…

OpenCV輪廓近似與Python命令行參數解析

在計算機視覺任務中&#xff0c;輪廓分析是目標檢測、形狀識別的核心步驟。而approxPolyDP函數作為輪廓簡化的關鍵工具&#xff0c;能有效減少輪廓頂點數量&#xff0c;降低計算復雜度&#xff1b;同時&#xff0c;argparse庫則能讓Python腳本更靈活、易用。本文將結合具體案例…

基于Springboot在線音樂推薦平臺

目錄 一、項目介紹 二、功能介紹 三、核心代碼 四、效果圖 源碼獲取 前言 在經濟繁榮的浪潮過去后&#xff0c;社會的焦點逐漸從物質追求轉向了文化和生活品質的提升[1]。文化生活的繁榮成為人們關注的焦點之一&#xff0c;而音樂&#xff0c;作為文化的一部分&#xff0…

LeetCode算法日記 - Day 26: 歸并排序、交易逆序對的總數

目錄 1. 歸并排序 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 交易逆序對的總數 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 歸并排序 912. 排序數組 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums&#xff0c;請你將該數組升序排列。 你必須在 不使用任…

C++(Qt)軟件調試---vcpkg安裝crashpad(34)

C(Qt)軟件調試—vcpkg安裝crashpad&#xff08;34&#xff09; 文章目錄C(Qt)軟件調試---vcpkg安裝crashpad&#xff08;34&#xff09;[toc]1 概述&#x1f41c;2 環境配置3 qt使用crashpad庫捕獲異常4 cmake中添加crashpad5 相關地址&#x1f410;更多精彩內容&#x1f449;內…

Kafka 副本同步異常與 ISR 收縮故障排查實錄

背景 某高流量 Kafka 集群&#xff08;原 10G 網卡&#xff09;在切中心時頻繁觸發帶寬報警&#xff0c;擴容至 25G 網卡后出現副本同步異常&#xff1a; 操作流程&#xff1a;停機→升級網卡→重啟→觸發分區同步→切換首選 Leader現象&#xff1a; 寫入流量上升后&#xff0c…

頂點 (VS)vs 片段(FS):OpenGL紋理滾動著色器的性能博弈與設計哲學

一個微妙的選擇&#xff0c;影響整個應用性能表現在實時圖形渲染中&#xff0c;實現紋理滾動效果是一種常見需求。但當我們在頂點著色器和片段著色器之間做出不同實現選擇時&#xff0c;會對性能產生顯著影響。今天&#xff0c;我們將深入探討這兩種實現的差異&#xff0c;幫助…

基于博客系統的自動化測試項目

目錄 一、引言 二、項目背景 三、項目功能 1&#xff09;初始登錄界面 2&#xff09;博客首頁 3&#xff09;博客詳情頁 4&#xff09;博客編輯頁 四、測試工具 1&#xff09;基礎操作系統環境 2&#xff09;瀏覽器環境 3&#xff09;開發與測試工具環境 4&#xf…

R 語言 eulerr 包繪制韋恩圖:比例精準

在數據可視化中,韋恩圖是展示多組數據交集關系的常用工具,尤其在生物信息(如基因差異表達分析)、統計分析等領域高頻使用。但傳統繪圖工具常面臨橢圓比例失衡、數值顯示混亂、樣式調整繁瑣等問題,而 R 語言的eulerr包恰好能解決這些痛點 —— 它支持按數據比例自動適配圖形…

CRYPT32!CryptMsgUpdate函數分析和asn.1 editor nt5inf.cat 的總覽信息

0000: 30 83 09 69 2f ; SEQUENCE (9692f Bytes) 0005: 06 09 ; OBJECT_IDENTIFIER (9 Bytes) 0007: | 2a 86 48 86 f7 0d 01 07 02| ; "PKCS 7 已簽名 (1.2.840.113549.1.7.2)" 0010: …

04數據庫約束實戰:從入門到精通

感謝黑馬程序員提供的免費課程約束概念&#xff1a;約束是作用于表中字段上的規則&#xff0c;用于限制存儲在表中的數據。目的&#xff1a;保證數據庫中數據的正確、有效性和完整性。常見的幾種約束&#xff1a;注意&#xff1a;約束是作用于表中字段上的&#xff0c;可以在創…

WPF+IOC學習記錄

最近在學WPF&#xff0c;上一篇文章記錄了WPF的MVVM自己實現和用框架的區別&#xff08;WPFMVVM入門學習&#xff09;&#xff0c;接下這篇文章記錄一下在WPF中使用IOC&#xff0c;這里演示用的是微軟官方的DependencyInjection&#xff0c;也可以用其他的第三方框架。 項目源…

從零開始學習單片機16

STM32單片機STM32和51單片機的區別51單片機的外設資源少&#xff0c;寄存器少&#xff0c;運行速度慢&#xff0c;價格便宜&#xff0c;容易上手STM32單片機的外設資源更多&#xff0c;寄存器多&#xff0c;運行速度相對快&#xff0c;價格相對貴&#xff0c;上手相對較難STM32…

[特殊字符]論一個 bug 如何經過千難萬險占領線上

謹以此文獻給每一個曾與 Bug 搏斗、最終卻目睹它成功上線的你 本文旨在揭露 Bug 的狡猾&#xff0c;絕非鼓勵以下行為。若你照做&#xff0c;后果自負&#x1f436;每一個在線上逍遙法外的 Bug&#xff0c;都不是偶然。它是一場精心策劃的奇跡&#xff0c;是開發、聯調、測試、…