Redis的緩存擊穿和緩存雪崩

Redis緩存擊穿和緩存雪崩是兩種常見的緩存問題,它們都可能導致系統性能下降甚至崩潰。以下是對它們的詳細解釋:

一、緩存擊穿

  1. 定義

    • 緩存擊穿是指一個特定的緩存數據失效(例如過期),而此時大量請求同時訪問這個數據,導致這些請求直接穿透到數據庫,給數據庫帶來巨大壓力,甚至可能使數據庫崩潰。

    • 例如,假設有一個熱門商品的詳情頁數據存儲在Redis緩存中,緩存的有效期是1小時。當緩存過期的那一刻,如果大量用戶同時請求這個商品詳情頁,這些請求就會直接查詢數據庫。

  2. 解決方案

    • 互斥鎖(Mutex)機制:當緩存失效時,通過互斥鎖確保只有一個線程去數據庫查詢數據,其他線程等待。例如,使用Redis的SETNX命令(SET if Not eXists)來實現鎖。當一個線程獲取到鎖后,它會去數據庫查詢數據并更新緩存,其他線程等待鎖釋放后再從緩存中獲取數據。

    • 設置熱點數據永不過期:對于一些訪問量極高且數據不會頻繁變化的熱點數據,可以將其緩存設置為永不過期。不過這種方式需要謹慎使用,因為如果數據需要更新,就需要手動清除緩存并重新加載。

    • 本地緩存降級:在應用本地使用本地緩存(如Guava Cache)作為二級緩存。當Redis緩存失效時,先從本地緩存獲取數據,本地緩存失效后再去數據庫查詢,并同時更新本地緩存和Redis緩存。

二、緩存雪崩

  1. 定義

    • 緩存雪崩是指在緩存層(如Redis)的大量緩存數據在同一時間過期,導致大量請求同時穿透到數據庫,給數據庫帶來巨大的壓力。這種情況通常發生在緩存服務重啟或者緩存數據的過期時間設置不合理時。

    • 例如,假設系統中很多緩存數據的過期時間都設置為1小時,當1小時后這些緩存同時失效,大量請求就會同時查詢數據庫。

  2. 解決方案

    • 設置不同的過期時間:為緩存數據設置不同的過期時間,避免大量緩存同時失效。例如,可以為不同的緩存數據設置隨機的過期時間范圍,如1小時到1小時30分鐘之間。

    • 使用本地緩存作為緩沖:在應用本地使用本地緩存(如Guava Cache)作為二級緩存。當Redis緩存失效時,本地緩存可以暫時緩解壓力,同時從數據庫加載數據并更新Redis緩存。

    • 引入消息隊列:當緩存失效時,將請求放入消息隊列,通過異步處理的方式逐步從數據庫加載數據并更新緩存。這樣可以避免大量請求同時直接訪問數據庫。

    • 使用持久化機制:Redis提供了RDB(Redis Database Backup)和AOF(Append Only File)持久化機制。在Redis重啟后,可以通過這些持久化機制快速恢復緩存數據,減少緩存失效帶來的影響。

一、互斥鎖的實現原理

  1. 鎖的獲取

    • 使用SETNX命令嘗試為某個鍵設置值。如果鍵不存在,則設置成功,返回1,表示獲取鎖成功;如果鍵已經存在,則設置失敗,返回0,表示獲取鎖失敗。

    • 可以結合EXPIRE命令為鎖設置一個過期時間,防止線程獲取鎖后因異常導致鎖無法釋放。

  2. 鎖的釋放

    • 當線程完成任務后,通過DEL命令刪除鎖對應的鍵,釋放鎖。

二、互斥鎖的實現步驟

  1. 嘗試獲取鎖

    • 使用SETNX命令嘗試獲取鎖,并設置過期時間。

  2. 執行業務邏輯

    • 如果獲取鎖成功,執行業務邏輯(例如查詢數據庫并更新緩存)。

  3. 釋放鎖

    • 完成業務邏輯后,釋放鎖。

三、代碼示例(Java)

以下是使用Jedis(一個Java Redis客戶端)實現互斥鎖的代碼示例:

java

復制

import redis.clients.jedis.Jedis;public class RedisMutexLock {private static final String LOCK_SUCCESS = "OK";private static final String SET_IF_NOT_EXIST = "NX";private static final String SET_WITH_EXPIRE_TIME = "PX";private Jedis jedis;private String lockKey;private int expireTime; // 鎖的過期時間,單位為毫秒public RedisMutexLock(Jedis jedis, String lockKey, int expireTime) {this.jedis = jedis;this.lockKey = lockKey;this.expireTime = expireTime;}// 嘗試獲取鎖public boolean tryLock() {String result = jedis.set(lockKey, LOCK_SUCCESS, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);return LOCK_SUCCESS.equals(result);}// 釋放鎖public void unlock() {jedis.del(lockKey);}public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);String lockKey = "myLock";int expireTime = 3000; // 鎖的過期時間為3秒RedisMutexLock lock = new RedisMutexLock(jedis, lockKey, expireTime);// 嘗試獲取鎖if (lock.tryLock()) {try {// 執行業務邏輯System.out.println("Lock acquired. Executing business logic...");// 模擬業務邏輯處理時間Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();} finally {// 釋放鎖lock.unlock();System.out.println("Lock released.");}} else {System.out.println("Failed to acquire lock.");}}
}

總結

緩存擊穿和緩存雪崩都是緩存系統中常見的問題,它們都會導致數據庫壓力過大。解決這些問題的關鍵在于合理設計緩存策略,例如設置合理的過期時間、使用互斥鎖、引入本地緩存和消息隊列等。通過這些方法可以有效緩解緩存失效帶來的壓力,提高系統的穩定性和性能。

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

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

相關文章

Python訓練營Day4

浙大疏錦行 Python訓練營Day4 內容,pandas處理表格信息: 查看表格統計信息: data.mean()data.mode()data.median() 查看表格信息: data.info()data.describe()data.isnull()data.head() 填充空缺列: 數值型&#xff…

React 基本介紹與項目創建

為什么使用 React 以及前端框架 工作原理 React 通過構建虛擬 DOM(Virtual DOM)來高效管理界面。當組件的狀態或屬性發生變化時,React 會重新渲染生成新的虛擬 DOM,并通過 Diff 算法找出新舊虛擬 DOM 樹之間的差異,最…

OpenCV CUDA模塊設備層-----“小于閾值設為零” 的圖像處理函數thresh_to_zero_func()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 OpenCV CUDA 模塊(cudev) 中的一個仿函數生成器,用于創建一個 “小于閾值設為零” 的圖像處理函數對象。 這個函…

數字圖像處理學習筆記

1-圖像處理基礎_嗶哩嗶哩_bilibili 輸出圖像像素點需要將圖象值要作類型轉換,轉成Int 圖像仿射變換 線性變換平移 線性變換: 1,變換前直線,變換后仍然直線 2,直線比例不變 3,直線到遠點的距離不變 仿射變…

用systemd管理GreatSQL服務詳解

用systemd管理GreatSQL服務詳解 1.GreatSQL服務文件 官網 greatsql.service 文件 [Unit] DescriptionGreatSQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Aftersyslog.target [Install] …

【AIGC】深度剖析AI倫理:強化隱私防線,推動算法公平性的核心議題

博客主頁: [小????????] 本文專欄: AIGC 文章目錄 🍊1 人工智能興起背后的倫理及道德風險1.1 算法偏見與歧視1.2 數據隱私侵權1.3 透明度受限1.4 決策失衡1.5 AI生成內容的危險性 🍊2 建構AIGC倫理觀:實現人機共創的永…

WebSocket技術全面解析:從歷史到實踐

WebSocket技術全面解析:從歷史到實踐 WebSocket作為一種全雙工通信協議,徹底改變了Web應用的實時交互模式。它于2011年被IETF正式標準化為RFC 6455,解決了傳統HTTP協議在實時通信中的根本缺陷。本文將深入探討WebSocket的發展歷程、技術原理、…

單用戶模式、緊急模式、救援模式有什么區別

文章目錄 **一、單用戶模式(Single User Mode)****功能與用途****啟動特點****進入方式** **二、緊急模式(Emergency Mode)****功能與用途****啟動特點****進入方式** **三、救援模式(Rescue Mode)****功能…

【大模型入門】訪問GPT的API

目錄 0 前言 免費訪問GPT的API Windows下環境變量的設置 1 非流式輸出 1.1 使用requests庫 1.2 使用OpenAI庫 2 流式輸出 2.1 使用requests庫 2.2 使用OpenAI庫 3 使用OpenAI庫與GPT聊天(存儲對話歷史版) 4 嵌入向量embeddings 4.1 創建嵌入向…

Jenkins 部署腳本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止舊進程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固態閃存NV196NV201

美光固態閃存技術深度解析:NV183、NV185、NV196與NV201系列 一、技術架構與核心參數對比 1. 制程工藝與容量布局 美光NV183/NV185/NV196/NV201系列采用176層3D NAND技術,通過垂直堆疊提升存儲密度。其中: NV183:主打256GB容量段…

基于單片機PWM控制逆變電源設計資料集:全面掌握逆變電源設計精髓

基于單片機PWM控制逆變電源設計資料集:全面掌握逆變電源設計精髓 去發現同類優質開源項目:https://gitcode.com/ 項目介紹 在現代電子技術中,逆變電源的設計與應用占據了至關重要的位置。今天,我將為您介紹一個優秀的開源項目——基于單片…

Docker Buildx 構建多架構鏡像(Redis、Mysql、Java8、Nginx)

目標 ARM64 麒麟電腦無法直接拉取 Redis 鏡像,需在 Windows x86 電腦上通過 多架構構建工具(如 Docker Buildx) 生成適配 ARM64 的 Redis 鏡像,再打包傳輸到目標設備。 一、核心問題:跨架構鏡像兼容性 直接保存的 redi…

代理IP的安全陷阱:如何避免中間人攻擊與IP池污染?

在跨境業務、數據采集等場景中,代理IP已成為剛需工具。然而,其隱藏的安全風險卻常被忽視——輕則泄露隱私,重則導致賬號封禁、數據劫持甚至金融損失。本文將深入剖析兩大核心風險(中間人攻擊與IP池污染),并…

深入理解大語言模型中的超參數:Temperature、Top-p 與更多

隨著大語言模型(LLM)如 GPT、Claude、Gemini 的廣泛應用,調優生成文本的質量與風格成為開發者和研究人員的重要課題。其中,超參數(Hyperparameters)如 temperature 和 top_p 扮演了核心角色,影響…

譯碼器Multisim電路仿真匯總——硬件工程師筆記

目錄 74LS實現二線三線譯碼器 1 74LS139D和74LS138D基礎知識 1.1 74LS139D 二線四線譯碼器 1.1.1 功能特點 1.1.2 引腳功能 1.1.3 工作原理 1.1.4 應用場景 1.1.5 使用方法 1.1.6 注意事項 1.6.7 邏輯真值表 1.2 74LS138D 3線8線譯碼器 1.2.1 功能特點 1.2.2 引腳…

國產 OFD 標準公文軟件數科 OFD 閱讀器:OFD/PDF 雙格式支持,公務辦公必備

各位辦公軟件小達人們,今天咱來聊聊數科OFD閱讀器! 軟件下載地址安裝包 這軟件啊,是基于咱國家自主OFD標準的版式閱讀軟件,主要用來閱讀和處理OFD/PDF電子文件,還能用于公務應用擴展。它支持打開和瀏覽OFD/PDF格式的文…

vue中的toRef

在 Vue 中, toRef 函數用于將響應式對象的屬性轉換為一個獨立的 ref 對象,同時保持與原始屬性的關聯。其參數格式及用法如下: toRef 的參數說明 1. 參數 1:源對象(必須) - 類型: Object &…

暖通鍋爐的智能管控:物聯網實現節能又舒適?

暖通鍋爐系統在建筑供暖、工業供熱等領域扮演著重要角色,其運行效率和能源消耗直接關系到用戶的使用體驗和成本支出。傳統的暖通鍋爐管理方式往往依賴人工操作和經驗判斷,存在能耗高、調節不靈活、舒適性差等問題。隨著物聯網技術的發展,暖通…

PHP:從入門到進階的全面指南

PHP(Hypertext Preprocessor)作為一種廣泛使用的開源腳本語言,尤其適用于 Web 開發并可嵌入 HTML 中。自誕生以來,PHP 憑借其簡單易學、功能強大以及豐富的生態系統,成為了眾多網站和 Web 應用程序開發的首選語言之一。…