如何保證本地緩存和redis的一致性

1. Cache Aside Pattern(旁路緩存模式)??

?核心思想?:應用代碼直接管理緩存與數據的同步,分為讀寫兩個流程:

  • ?讀取數據?:
    1. 先查本地緩存(如 Guava Cache)。
    2. 若本地未命中,則查 Redis。
    3. 若 Redis 也未命中,則從數據庫加載數據,并回填到本地緩存和 Redis。
  • ?寫入數據?:
    1. 直接更新數據庫。
    2. ?刪除本地緩存和 Redis 中的相關數據?(避免舊數據殘留)。
// 偽代碼示例
public Data getData(String key) {// 1. 查本地緩存Data data = localCache.getIfPresent(key);if (data != null) return data;// 2. 查 Redisdata = redis.get(key);if (data != null) {// 回填本地緩存localCache.put(key, data);return data;}// 3. 從數據庫加載data = db.load(key);if (data != null) {localCache.put(key, data);redis.set(key, data);}return data;
}public void updateData(String key, Data newData) {// 1. 更新數據庫db.update(newData);// 2. 刪除緩存(本地 + Redis)localCache.invalidate(key);redis.delete(key);
}

?優點?:實現簡單,適用于讀多寫少的場景。
?缺點?:存在短暫不一致窗口(如寫入后需等待緩存過期)。


?2. 發布訂閱模式(Pub/Sub)??

?適用場景?:分布式系統中,多個應用實例需要同步緩存狀態。
?方案?:

  1. 當數據更新時,發送消息到消息隊列(如 Redis 的 Pub/Sub 或 Kafka)。
  2. 所有訂閱該主題的應用實例監聽到消息后,主動刪除本地緩存和 Redis 中的舊數據。
// 發布消息示例(更新數據時)
public void updateData(String key, Data newData) {db.update(newData);// 刪除 Redis 緩存redis.delete(key);// 發布失效事件redis.publish("cache-invalidation", key);
}// 訂閱消息示例(各實例啟動時訂閱)
redis.subscribe("cache-invalidation", (channel, message) -> {localCache.invalidate(message); // 刪除本地緩存
});

?優點?:解耦緩存失效邏輯,適合分布式系統。
?缺點?:消息可能丟失或延遲,需處理冪等性。


?3. 過期時間策略?

?核心思想?:為緩存設置合理的 TTL(Time-To-Live),依賴自動過期減少不一致時間窗口。
?適用場景?:對實時一致性要求不高,允許最終一致性的場景。
?優化點?:

  • 通過隨機 TTL 避免緩存雪崩。
  • 結合主動失效(如更新時刪除)縮短過期時間。
// 本地緩存設置 TTL
Cache<String, Data> cache = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES) // 本地緩存 5 分鐘過期.build();// Redis 設置 TTL
redis.setex(key, 300, data); // Redis 緩存 5 分鐘過期

?4. 雙刪策略(Double Delete)??

?適用場景?:高并發寫操作場景,減少緩存臟數據。
?流程?:

  1. 更新數據庫前,先刪除緩存。
  2. 更新數據庫后,延遲一段時間再次刪除緩存(防止并發讀寫導致的臟數據)。
public void updateData(String key, Data newData) {// 第一步:刪除緩存localCache.invalidate(key);redis.delete(key);// 更新數據庫db.update(newData);// 第二步:延遲刪除(如通過異步線程)scheduleDelete(key, 1000); // 1 秒后再次刪除
}

?5. 讀寫鎖(Read-Write Lock)??

?核心思想?:通過鎖機制保證讀寫操作的原子性。
?方案?:

  • 寫操作時加鎖,阻止其他讀寫操作。
  • 讀操作時加讀鎖,允許多個并發讀取。
// 使用 Redis 分布式鎖(示例)
public void updateDataWithLock(String key, Data newData) {String lockKey = "lock:" + key;boolean locked = redis.setnx(lockKey, "locked", 10, TimeUnit.SECONDS);if (locked) {try {// 更新數據庫db.update(newData);// 刪除緩存localCache.invalidate(key);redis.delete(key);} finally {redis.del(lockKey);}} else {// 獲取鎖失敗,重試或返回錯誤}
}

?6. 本地緩存與 Redis 的協同設計?

  • ?分層緩存?:本地緩存作為一級緩存,Redis 作為二級緩存。
    • 優先從本地緩存讀取,未命中則查詢 Redis。
    • 更新時同步刪除兩級緩存。
  • ?熱點數據管理?:對熱點數據設置更短的 TTL 或主動推送更新。

?關鍵注意事項?

  1. ?最終一致性?:多數場景下無需強一致,允許短暫延遲。
  2. ?緩存穿透?:對空值或無效 Key 也進行緩存(如設置短 TTL)。
  3. ?緩存雪崩?:設置隨機 TTL,避免大量緩存同時失效。
  4. ?監控與告警?:通過統計信息(如?cache.stats())監控命中率、延遲等指標。

?總結方案選擇?

?場景??推薦方案?
單機應用,低并發Cache Aside + TTL
分布式系統,多實例Pub/Sub + Cache Aside
高并發寫操作雙刪策略 + 分布式鎖
允許最終一致性TTL 過期 + 異步更新

通過結合業務需求,靈活采用上述策略,可以有效降低本地緩存與 Redis 的不一致風險。

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

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

相關文章

k8s通過service標簽實現藍綠發布

k8s通過service標簽實現藍綠發布 通過k8s service label標簽實現藍綠發布方法1:使用kubelet完成藍綠切換1. 創建綠色版本1.1 創建綠色版本 Deployment1.2 創建綠色版本 Service 2. 創建藍色版本2.1 創建藍色版本 Deployment2.2 創建藍色版本 Service 3. 創建藍綠切換SVC (用于外…

智慧酒店企業站官網-前端靜態網站模板【前端練習項目】

最近又寫了一個靜態網站&#xff0c;智慧酒店宣傳官網。 使用的技術 html css js 。 特別適合編程學習者進行網頁制作和前端開發的實踐。 項目包含七個核心模塊&#xff1a;首頁、整體解決方案、優勢、全國案例、行業觀點、合作加盟、關于我們。 通過該項目&#xff0c;小伙伴們…

Epplus 8+ 許可證設置

Epplus 8 之后非商業許可證的設置變了如果還用普通的方法會報錯 Unhandled exception. OfficeOpenXml.LicenseContextPropertyObsoleteException: Please use the static ‘ExcelPackage.License’ property to set the required license information from EPPlus 8 and later …

CST1016.基于Spring Boot+Vue高校競賽管理系統

計算機/JAVA畢業設計 【CST1016.基于Spring BootVue高校競賽管理系統】 【項目介紹】 高校競賽管理系統&#xff0c;基于 DeepSeek Spring AI Spring Boot Vue 實現&#xff0c;功能豐富、界面精美 【業務模塊】 系統共有兩類用戶&#xff0c;分別是學生用戶和管理員用戶&a…

2025年第十六屆藍橋杯省賽C++ 研究生組真題

2025年第十六屆藍橋杯省賽C 研究生組真題 1.說明2.題目A&#xff1a;數位倍數&#xff08;5分&#xff09;3.題目B&#xff1a;IPv6&#xff08;5分&#xff09;4.題目C&#xff1a;變換數組&#xff08;10分&#xff09;5.題目D&#xff1a;最大數字&#xff08;10分&#xff…

空調開機啟動后發出噼里啪啦的異響分析與解決

背景 當空調使用時由于制冷或制熱運轉時&#xff08;關機后可能也會出現&#xff09;&#xff0c;塑料件熱脹冷縮引起&#xff0c;可能會出現“咔咔”的聲音&#xff1b;空調冷媒在空調內管路流動時會出現輕微的“沙沙”的聲音&#xff1b;也有可能是新裝的空調擺風軸出現響聲…

BERT、T5、ViT 和 GPT-3 架構概述及代表性應用

BERT、T5、ViT 和 GPT-3 架構概述 1. BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09; 架構特點 基于 Transformer 編碼器&#xff1a;BERT 使用多層雙向 Transformer 編碼器&#xff0c;能夠同時捕捉輸入序列中每個詞的左右上下文信息…

選導師原理

總述 一句話總結&#xff1a;是雷一定要避&#xff0c;好的一定要搶。方向契合最好&#xff0c;不契合適當取舍。 首先明確自身需求&#xff1a; 我要學東西&#xff01;青年導師&#xff0c;好溝通&#xff0c;有沖勁&#xff0c;高壓力。 我要擺爛&#xff01;中老年男性教…

【過程控制系統】PID算式實現,控制系統分類,工程應用中控制系統應該注意的問題

目錄 1-1 試簡述過程控制的發展概況及各個階段的主要特點。 1-2 與其它自動控制相比&#xff0c;過程控制有哪些優點&#xff1f;為什么說過程控制的控制過程多屬慢過程&#xff1f; 1-3 什么是過程控制系統&#xff0c;其基本分類是什么&#xff1f; 1-4 何為集散控制系統…

2025年第十六屆藍橋杯省賽真題解析 Java B組(簡單經驗分享)

之前一年拿了國二后&#xff0c;基本就沒刷過題了&#xff0c;實力掉了好多&#xff0c;這次參賽只是為了學校的加分水水而已&#xff0c;希望能拿個省三吧 >_< 目錄 1. 逃離高塔思路代碼 2. 消失的藍寶思路代碼 3. 電池分組思路代碼 4. 魔法科考試思路代碼 5. 爆破思路…

JAVA EE_文件操作和IO

人們大多數時候的焦慮&#xff0c;大概是太想要一個那不確定的答案了吧。 一一 陳長生. 1.認識文件 現實中&#xff0c;我們把一張一張有內容的紙整合在一起稱為文件&#xff0c;計算機中&#xff0c;通過硬盤這種I/O設備進行數據保存時&#xff0c;它會獨立成一個一個的單位保…

UNITY 屏幕UI自適應

1.主要就是根據屏幕的選擇根據尺寸 和UI的錨點和中心點來選擇&#xff0c;也可以通過代碼來動態修改 2.參考視頻&#xff1a;Unity UGUI屏幕自適應看這個就夠了_嗶哩嗶哩_bilibili

05-RabbitMQ 面試題-mk

文章目錄 1.RabbitMQ 核心組件及功能詳解2.RabbitMQ-如何保證消息不丟失?3.RabbitMQ消息的重復消費問題如何解決的?4.RabbitMQ中死信交換機 ? (RabbitMQ延遲隊列有了解過嘛)5.RabbitMQ如果有100萬消息堆積在MQ , 如何解決(消息堆積怎么解決)6.RabbitMQ的高可用機制有了解過嘛…

產品需求設計評審會:三步精準定位需求核心

“不謀全局者&#xff0c;不足謀一域&#xff1b;不謀萬世者&#xff0c;不足謀一時。”——陳澹然 強調了從全局和長遠的角度去謀劃事情的重要性&#xff0c;與產品設計中先從宏觀層面定位需求&#xff0c;而不是陷入細節的理念相契合。 今日清晨&#xff0c;我參加了一場產品…

java中常用的集合 - 面試篇

HashMap 一、基礎常量以及結構 //數組默認初始容量static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16//數組容量最大值static final int MAXIMUM_CAPACITY 1 << 30;//默認擴容因子static final float DEFAULT_LOAD_FACTOR 0.75f;//鏈表長度閾值 樹…

PDF解析示例代碼學習

以下是結合多種技術實現的PDF解析詳細示例&#xff08;Python實現&#xff09;&#xff0c;涵蓋文本、表格和掃描件處理場景&#xff1a; 一、環境準備與依賴安裝 # 核心依賴庫 pip install pdfplumber tabula-py pytesseract opencv-python mysql-connector-python 二、完整…

Docker容器網絡與NAT

一、背景 之前分享關于NAT網絡地址轉換的相關文章&#xff0c;docker中的網絡正好使用到了NAT&#xff0c;順帶著把這個分享一下&#xff0c;分析docker容器的網絡數據包流出、數據流入原理分析。 知識回顧: docker運行一個容器之后&#xff0c;會給這個容器一個獨立的netns網絡…

Spring Boot 熱部署詳解,包含詳細的配置項說明

Spring Boot 熱部署詳解 1. 熱部署簡介 熱部署&#xff08;Hot Deployment&#xff09;允許在應用運行時修改代碼或配置文件&#xff0c;無需重啟應用即可使更改生效。Spring Boot 通過 spring-boot-devtools 模塊實現這一功能&#xff0c;其核心依賴于 LiveReload 技術和自動…

詳細解讀 box-sizing: border-box;

代碼解讀 * {box-sizing: border-box; } 解釋&#xff1a; * - 這是CSS的通用選擇器&#xff0c;表示匹配文檔中的所有元素 box-sizing: border-box; - 設置元素的盒模型計算方式為border-box 盒模型說明&#xff1a; 默認情況下&#xff0c;CSS使用content-box盒模型&…

《一文講透》第7期:KWDB 巧用標簽與索引優化查詢性能

引言 在工業物聯網快速發展的今天&#xff0c;各類智能傳感器設備已廣泛應用于智能制造、能源電力、智慧城市等關鍵領域。這些設備以極高的采樣頻率持續產生監測數據&#xff0c;使得單條產線每秒產生數十萬條傳感器數據已成為行業常態&#xff0c;這對數據存儲系統的寫入吞吐…