Redis 緩存問題詳解及解決方案

一、緩存擊穿 (Cache Breakdown)

原理
某個熱點 Key 突然過期,同時大量并發請求該 Key,導致請求直接穿透緩存擊穿到數據庫。

解決方案

  1. 互斥鎖 (Mutex Lock)
    當緩存失效時,僅允許一個線程重建緩存,其他線程等待。
  2. 邏輯過期
    不設置物理過期時間,在 Value 中存儲過期時間戳,異步更新緩存。

Python 實現 (互斥鎖方案)

import redis
import time
import threadingr = redis.Redis()def get_data(key):# 1. 嘗試從緩存讀取data = r.get(key)if data:return data# 2. 嘗試獲取鎖 (SETNX + EXPIRE)lock_key = f"lock:{key}"if r.set(lock_key, "locked", nx=True, ex=5):  # 設置5秒鎖過期try:# 3. 模擬數據庫查詢data_from_db = "Database Result"  # 真實場景需查DB# 4. 寫入緩存r.setex(key, 60, data_from_db)  # 緩存60秒return data_from_dbfinally:r.delete(lock_key)else:# 5. 未獲鎖則短暫等待重試time.sleep(0.1)return get_data(key)  # 遞歸重試# 測試并發
def test_breakdown():key = "hot_key"threads = []for i in range(10):  # 模擬10個并發請求t = threading.Thread(target=lambda: print(get_data(key)))threads.append(t)t.start()for t in threads:t.join()test_breakdown()

二、緩存穿透 (Cache Penetration)

原理
請求訪問數據庫中不存在的數據(如非法ID),導致每次請求都穿透到數據庫。

解決方案

  1. 布隆過濾器 (Bloom Filter)
    快速判斷 Key 是否可能存在數據庫中。
  2. 緩存空對象
    對不存在的數據也進行緩存(設置短過期時間)。

Python 實現 (緩存空對象)

def get_data_penetration(key):# 1. 嘗試從緩存讀取data = r.get(key)if data is not None:return None if data == b'NULL' else data  # 處理空值# 2. 查詢數據庫 (模擬不存在)data_from_db = None  # 假設數據庫返回空if data_from_db is None:# 3. 緩存空對象 (5分鐘過期)r.setex(key, 300, 'NULL')  # 特殊值標記return Noneelse:r.setex(key, 60, data_from_db)return data_from_db

三、緩存雪崩 (Cache Avalanche)

原理
大量 Key 同時過期,導致所有請求穿透到數據庫,引發連鎖故障。

解決方案

  1. 隨機過期時間
    基礎過期時間 + 隨機值,分散 Key 過期時間。
  2. 熱點數據永不過期
    后臺異步更新緩存。
  3. 多級緩存架構
    本地緩存 + Redis 緩存。

Python 實現 (隨機過期時間)

import randomdef set_data(key, value):# 基礎過期時間 + 隨機偏移 (0-300秒)expire = 3600 + random.randint(0, 300)r.setex(key, expire, value)# 批量設置緩存時使用
set_data("key1", "value1")
set_data("key2", "value2")

四、緩存預熱 (Cache Warm-up)

原理
系統上線前預先加載熱點數據到緩存,避免冷啟動時大量請求穿透到數據庫。

實現方式

  1. 手動觸發腳本加載數據
  2. 定時任務預熱
  3. 啟動時自動加載

Python 實現

def cache_warm_up():hot_keys = ["news:1", "product:100", "top:list"]  # 預定義熱點Keyfor key in hot_keys:if not r.exists(key):# 從數據庫加載數據data = f"Data for {key}"  # 真實場景需查DBr.setex(key, 3600, data)  # 緩存1小時print(f"Preloaded: {key}")# 系統啟動時執行
cache_warm_up()

總結對比表

問題核心原因解決方案關鍵實現技術
緩存擊穿熱點 Key 突然失效互斥鎖、邏輯過期SETNX + EXPIRE
緩存穿透查詢不存在的數據布隆過濾器、緩存空對象特殊值標記 (如’NULL’)
緩存雪崩大量 Key 同時過期隨機過期時間、多級緩存基礎過期時間 + 隨機值
緩存預熱冷啟動時無緩存啟動時加載熱點數據初始化腳本加載

最佳實踐:生產環境中建議組合使用多種方案(如布隆過濾器+空對象+互斥鎖+隨機過期時間),并配合監控系統實時檢測緩存命中率。

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

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

相關文章

一周一個數據結構 第一周 --- 順序表(下)

文章目錄一、ArrayList的構造二、ArrayList常見操作三、ArrayList的遍歷四、ArrayList練習1.【小練習】2.楊輝三角3.簡單的洗牌算法五、ArrayList小結在上一章節中,我們通過代碼示例以及畫圖的方式詳細了解了順序表,并模擬實現了它。那么,是不…

OpenCV的關于圖片的一些運用

一、讀取圖片通過cv2庫中的imread()方法讀取圖片代碼:import cv2 a cv2.imread(1.png) cv2.imshow(tu,a) b cv2.waitKey(4000) # 圖片執行時間 cv2.destroyAllWindows() # 關閉所有端口 print("圖像形狀(shape):",a.shape) print…

【數據結構——并查集】

引入 并查集(Disjoint Set Union,DSU)是一種用于管理元素分組的數據結構。 合并(Union):將兩個不相交的集合合并為一個集合。 查找(Find):確定某個元素屬于哪個集合&…

在 Vue 中使用 ReconnectingWebSocket實現即時通訊聊天客服功能

在 Vue 中使用 ReconnectingWebSocketReconnectingWebSocket 是一個自動重連的 WebSocket 實現,非常適合在 Vue 項目中使用。下面是如何在 Vue 中集成和使用它的方法:搜索 "程序員老狼"安裝 ReconnectingWebSocket首先,你需要安裝…

智能體革命:網絡安全人的角色重塑與突圍指南

AI賦能千行百業的趨勢不可逆轉,當AI學會滲透測試,安全工程師的出路在哪里? 2025年8月7日,OpenAI正式發布GPT-5的消息刷屏科技圈。這個達到博士生水平的“統一”人工智能模型,將AI幻覺率降低60%,成本下降45%…

用于水T1值和脂肪分數量化的上半身自由呼吸磁共振指紋成像|文獻速遞-醫學影像算法文獻分享

Title題目Upper-body free-breathing Magnetic Resonance Fingerprinting applied tothe quantification of water T1 and fat fraction用于水T1值和脂肪分數量化的上半身自由呼吸磁共振指紋成像 01文獻速遞介紹磁共振指紋成像(MRF)是十年前推出的一種高…

Apache RocketMQ:消息可靠性、順序性與冪等處理的全面實踐

Apache RocketMQ 是一個高性能、高可靠的分布式消息中間件,廣泛應用于異步通信、事件驅動架構和分布式系統中。本文深入探討 RocketMQ 的消息可靠性、順序性和冪等處理機制,結合 Redisson 分布式鎖實現冪等消費,提供詳細的代碼示例和實踐建議…

無服務器日志分析由 Elasticsearch 提供支持,推出新的低價層

作者:來自 Elastic Log Analytics Elastic Observability Logs Essentials 在 Elastic Cloud Serverless 上提供成本效益高、無麻煩的日志分析。 SREs 可以攝取、搜索、豐富、分析、存儲和處理日志,而無需管理部署的運營開銷。[](https://www.elastic.co…

(Arxiv-2025)Phantom-Data:邁向通用的主體一致性視頻生成數據集

Phantom-Data:邁向通用的主體一致性視頻生成數據集 paper是字節發布在Arxiv2025的工作 paper title:Phantom-Data: Towards a General Subject-Consistent Video Generation Dataset Code:鏈接 Abstract 近年來,主體到視頻&#…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘mlflow’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘mlflow’問題 摘要 在Python開發中,pip install 報錯是一種常見問題,尤其是在使用集成開發環境(IDE)如PyCharm時…

2020/12 JLPT聽力原文 問題一 3番

3番:會社で女の人と男の人が話しています。女の人は倉庫に入るとき、どの順番で入口のボタンを押さなければなりませんか。 女:すみません。地下の倉庫に行って、資料を取ってきたいんですが、入口の開け方がわからなくて… 男:ああ、最近、管…

C#/.NET/.NET Core技術前沿周刊 | 第 49 期(2025年8.1-8.10)

前言 C#/.NET/.NET Core技術前沿周刊,你的每周技術指南針!記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿,助力技術成長與視野拓寬。 歡迎投稿、推薦…

基于強化學習的目標跟蹤 研究初探

強化學習 目標跟蹤Visual tracking by means of deep reinforcement learning and an expert demonstratorYOLO 檢測下基于 ETC-DDPG 算法的無人機視覺跟蹤基于特征與深度強化學習方法的機器人視覺伺服技術研究高性能可拓展視頻目標跟蹤算法研究基于目標運動與外觀特征的多目標…

排序與查找,簡略版

數組的排序 排序的基本介紹 排序是將一組數據,按照一定順序進行排列的過程 排序的分類: 內部排序: 一次性適用數據量小的情況 將需要處理的數據都加載到內部存儲器中進行排序。包括交換式排序,選擇式排序,插入式排序 外…

打靶日常-XSS(反射型和存儲型)

目錄 小皮: 1. 2.這里需要登錄,我們之前爆破出賬號密碼在這里就可以用?編輯 登錄之后:?編輯 使用工具: 先輸入正確字符進行測試:aaa 進行測試: 3.換種控制臺顯示 結果:(使用f12大法) DVWA: 反射型XSS: 低: ?編輯 中:大小寫繞過: ?編輯 也可以雙寫繞過: ?編…

二叉搜索樹深度解析:從原理實現到算法應用----《Hello C++ Wrold!》(18)--(C/C++)

文章目錄前言二叉搜索樹(二叉排序樹或二叉查找樹)二叉搜索樹的模擬實現二叉搜索樹和有序數組二分查找的比較兩個搜索模型作業部分前言 二叉搜索樹(Binary Search Tree,簡稱 BST)作為一種重要的樹形數據結構&#xff0…

牛客.空調遙控二分查找牛客.kotori和氣球(數學問題)力扣.二叉樹的最大路徑和牛客.主持人調度(二)

目錄 牛客.空調遙控 二分查找 牛客.kotori和氣球(數學問題) 力扣.二叉樹的最大路徑和 牛客.主持人調度(二) 牛客.空調遙控 枚舉n個空調之后,使數組有序,左右下標,用二分查找,然后一個求 長度就好 二分查找 /二分理…

《嵌入式Linux應用編程(二):標準IO高級操作與文件流定位實戰》

今日學習內容1. 行輸入函數安全實踐(1) fgets vs gets函數安全特性換行符處理緩沖區保護fgets指定讀取長度(size-1)保留\n并添加\0安全(防溢出)gets無長度限制將\n替換為\0危險2. Linux標準文件流文件流符號設備 標準輸入stdin鍵盤…

Springboot2+vue2+uniapp 小程序端實現搜索聯想自動補全功能

目錄 一、實現目標 1.1 需求 1.2 實現示例圖: 二、實現步驟 2.1 實現方法簡述 2.2 簡單科普 2.3 實現步驟及代碼 一、實現目標 1.1 需求 搜索聯想——自動補全 (1)實現搜索輸入框,用戶輸入時能顯示模糊匹配結果 &am…

極簡 5 步:Ubuntu+RTX4090 源碼編譯 vLLM

極簡 5 步:UbuntuRTX4090 源碼編譯 vLLM1. 系統依賴(一次性)2. 進入源碼目錄 & 激活環境3. 啟用 ccache 自動并行度4. 拉代碼 編譯(2 行搞定)5. 更新 flash-attn(與 vLLM 配套)6. 啟動 4 …