Redis之緩存更新策略

緩存更新策略

在這里插入圖片描述

文章目錄

  • 緩存更新策略
    • 一、策略對比
    • 二、常見的緩存更新策略
    • 三、如何選擇策略
    • 四、實際應用示例
    • 五、使用 Cache-Aside + TTL 的方式,實現緩存商鋪信息詳情
      • 1.引入StringRedisTemplate
      • 2.將查詢商鋪信息加入緩存
      • 3.更新商鋪信息時移除緩存
      • 總結
    • 六、注意事項

一、策略對比

內存淘汰超時剔除主動更新
說明不用自己維護,
利用Redis的內存淘汰機制,
當內存不足時自動淘汰部分數據。下次查詢時更新緩存。
給緩存數據添加TTL時間,
到期后自動刪除緩存。
下次查詢時更新緩存。
編寫業務邏輯,
在修改數據庫的同時,更新緩存
一致性一般
維護成本

業務場景

  • 低一致性需求:使用內存淘汰機制。例如商鋪類型的查詢緩存
  • 高一致性需求:主動更新,并以超時剔除作為兜底方案。例如店鋪詳情查詢的緩存

二、常見的緩存更新策略

  1. Cache Aside Pattern旁路緩存模式):由緩存的調用者,在更新數據庫的同時更新緩存。
    • 原理
      • 讀操作:先查詢緩存,若命中則直接返回;未命中則從數據庫加載數據并寫入緩存。
      • 寫操作:先更新數據庫,再刪除緩存(或更新緩存)。
    • 優點:簡單易實現,適用于大多數場景。
    • 缺點:可能存在短暫的數據不一致(如并發寫入導致臟數據)。
    • 場景:讀多寫少、對一致性要求不高的場景。
  2. Read / Write Through Pattern讀穿/寫穿):緩存與數據庫整合為一個服務,由服務來維護一致性。調用者調用該服務,無需關心緩存一致性問題。
    • 讀穿透(Read-Through)
      • 當緩存未命中時,由緩存服務自動從數據庫加載數據并回填緩存 。
    • 寫穿透(Write-Through)
      • 數據更新時,同時寫入緩存和數據庫,保證兩者同步。
    • 優點:對業務透明,數據一致性高。
    • 缺點:寫操作延遲較高,依賴緩存服務的可靠性。
    • 場景:強一致性要求的場景。
  3. Write Behind Caching Pattern異步寫回):調用者只操作緩存,由其他線程異步地將緩存數據持久化到數據庫,保證最終一致性。
    • 原理
      • 寫操作僅更新緩存,異步批量將數據持久化到數據庫。
    • 優點:寫性能極高,減少數據庫壓力。
    • 缺點:存在數據丟失風險(如系統崩潰時為同步完成的數據)。
    • 場景:允許短暫不一致、寫密集型場景(如日志系統)。
  4. 被動更新(TTL刷新)
    • 原理
      • 為緩存設置過期時間(Time-To-Live,TTL),到期后自動失效并從數據庫重新加載。
    • 優點:實現簡單,避免長期臟數據。
    • 缺點:無法主動控制更新實際,可能出現緩存雪崩(大量緩存同時失效)。
    • 場景:數據變動頻率較低的場景。
  5. 主動更新(事件驅動)
    • 原理
      • 當數據庫數據變更時(如通過消息隊列或出發期),主動通知應用層更新或刪除對應緩存。
    • 優點:實時性高,減少無效查詢。
    • 缺點:依賴外部系統協同,復雜度較高。
    • 場景:分布式系統中強一致性要求的場景(如電商庫存更新)。

注意在使用Cache Aside Pattern方式的工程中,操作緩存和數據庫時有三個問題需要考慮

  1. 刪除緩存還是更新緩存?
    • 更新緩存:每次更新數據庫都更新緩存,無效寫操作較多
    • 刪除緩存【推薦】:更新數據庫時讓緩存失效,查詢時再更新緩存
  2. 如何保證緩存與數據庫的操作同時成功或同時失敗?
    • 單體系統:將緩存與數據庫操作放在一個事務
    • 分布式系統,利用TCC等分布式事務方案
  3. 先操作緩存還是先操作數據庫
    • 先刪除緩存,再操作數據庫
    • 先操作數據庫,再刪除緩存 【推薦】

三、如何選擇策略

  • 數據一致性要求:強一致性選 Write-Through 或主動更新;弱一致性可選 Cache-Aside 或 TTL。
  • 讀寫比例:讀多寫少優先 Cache-Aside;寫多考慮 Write-Behind。
  • 系統復雜度:簡單場景用 TTL 或 Cache-Aside;復雜場景用事件驅動。
  • 性能需求:高頻寫入可用 Write-Behind 降低延遲。

四、實際應用示例

  • 電商商品詳情頁:使用 Cache-Aside + TTL,配合消息隊列主動更新熱點商品。
  • 社交點贊數統計:采用 Write-Behind 異步更新數據庫,保證快速響應。
  • 全局配置信息:Read-Through 確保每次讀取都是最新配置。

五、使用 Cache-Aside + TTL 的方式,實現緩存商鋪信息詳情

1.引入StringRedisTemplate

    @Resourceprivate StringRedisTemplate stringRedisTemplate;

2.將查詢商鋪信息加入緩存

命中
未命中
存在
不存在
開始
提交商鋪id
從Redis查詢商鋪緩存
判斷緩存是否命中
返回商鋪信息
結束
根據id查詢數據庫
判斷商鋪是否存在
將商鋪數據寫入Redis
返回404
    @Overridepublic Result queryById(Long id) {// 1.從redis查詢商鋪緩存String key = CACHE_SHOP_KEY + id;String shopJson = stringRedisTemplate.opsForValue().get(key);// 2.判斷是否存在if (StrUtil.isNotBlank(shopJson)) {// 3.存在,直接返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}// 4.不存在,根據id查詢數據庫Shop shop = getById(id);if (shop == null) {// 5.數據庫不存在,返回錯誤return Result.fail("店鋪不存在!");}// 6.存在,寫入redis,加入過期時間stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), CACHE_SHOP_TTL, TimeUnit.MINUTES);return Result.ok(shop);}

3.更新商鋪信息時移除緩存

    @Overridepublic Result update(Shop shop) {if (shop.getId() == null) {return Result.fail("店鋪id不能為空!");}// 1.更新數據庫updateById(shop);// 2.刪除緩存stringRedisTemplate.delete(CACHE_SHOP_KEY + shop.getId());return Result.ok();}

總結

使用 Cache-Aside + TTL 緩存更新策略的最佳實踐方案:

  1. 低一致性需求:使用Redis自帶的內存淘汰機制
  2. 高一致性需求:主動更新,并以超時剔除作為兜底方案
    • 讀操作:
      • 緩存命中則直接返回
      • 緩存未命中則查詢數據庫,并寫入緩存,設定超時時間
    • 寫操作:
      • 先寫數據庫,然后再刪除緩存
      • 要確保數據庫與緩存操作的原子性

六、注意事項

  • 緩存穿透:惡意請求不存在的 key,可通過布隆過濾器防御。
  • 緩存雪崩:大量 Key 同時失效,需設置隨機 TTL 或禁用失效時間。
  • 緩存擊穿:熱點 Key 失效瞬間高并發,可用互斥鎖(Mutex Luck)保護。

緩存更新策略的選擇需結合業務場景、數據特點和技術架構綜合權衡,沒有絕對的最優解,只有最適合的方案。

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

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

相關文章

【工具變量】各地級市人口集聚及多中心程度數據集(2000-2023年)

多中心程度描述的是一個城市或區域內多個功能性中心的存在和分布情況;人口集聚度是指一定區域內人口的集中程度,它反映了區域內人口分布的不均衡性,這兩個概念相互關聯,通過分析地級市的多中心程度及人口集聚度可以幫助研究者理解…

函數對象-C++

1.定義 2.特點 、 1.解釋第一句 #include<stdio.h> using namespace std; #include<string> #include<map> #include <iostream> class print { public:void operator()(string s){cout << s << endl;} }; int main() {print print;pri…

Apifox下載安裝與使用

一、Apifox下載 官網地址:Apifox 點擊"免費下載",即可進行下載。 二、Apifox安裝 雙擊安裝文件即可安裝。

Python與圖像處理:從基礎操作到智能應用的全面解析

目錄 一、Python圖像處理的三大核心優勢 1.1 生態庫矩陣支撐 1.2 開發效率革命 1.3 跨領域協同能力 二、六大核心處理技術詳解 2.1 圖像基礎操作 2.2 圖像增強技術 2.3 特征提取算法 2.4 目標檢測技術 2.5 圖像分割技術 2.6 圖像生成技術 三、實戰案例&#xff1a;智…

雙 Token 與 單 Token 優缺點

雙Token與單Token認證機制對比 在Web應用開發中&#xff0c;身份認證和授權是保障系統安全的核心環節。隨著技術演進&#xff0c;基于Token的認證機制逐漸取代傳統Session方案&#xff0c;而雙Token與單Token架構的選型爭議也日益成為開發者關注的焦點。本文將從技術原理、優缺…

Spring Boot管理Spring MVC

Spring Boot真正的核心功能是自動配置和快速整合&#xff0c;通常Spring Boot應用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web啟動器嵌入了Spring MVC的依賴&#xff0c;并為Spring MVC提供了大量自動配置&#xff0c;可以適用于大多數Web開發…

1.凸包、極點、極邊基礎概念

目錄 1.凸包 2.調色問題 3.極性(Extrem) 4.凸組合(Convex Combination) 5.問題轉化(Strategy)?編輯 6.In-Triangle test 7.To-Left-test 8.極邊&#xff08;Extream Edges&#xff09; 1.凸包 凸包就是上面藍色皮筋圍出來的范圍 這些釘子可以轉換到坐標軸中&#xff0…

《如何用 Function 實現動態配置驅動的處理器注冊機制?》

大家好呀&#xff01;&#x1f44b; 今天我們來聊聊一個超實用的技術話題 - 如何用Java的Function接口實現動態配置驅動的處理器注冊機制。聽起來很高大上&#xff1f;別擔心&#xff0c;我會用最簡單的方式講清楚&#xff01;&#x1f60a; 一、為什么要用Function實現處理器…

【最新版】蕓眾商城獨立版源碼 425+插件 全新后臺框架

一.系統介紹 蕓眾商城系統最新版 已經更新425全插件版&#xff0c;一套系統支持各種新零售、商城、模式&#xff0c;天天美麗鏈動商城。不要相信那些外面的舊版本。舊版本等于是廢品&#xff0c;無法小程序運營的&#xff0c;框架還是舊的&#xff01; 蕓眾系統最新版 服務器可…

java 設計模式之單例模式

簡介 單例模式&#xff1a;一個類有且僅有一個實例&#xff0c;該類負責創建自己的對象&#xff0c;同時確保只有一個對象被創建。 特點&#xff1a;類構造器私有、持有自己實例、對外提供獲取實例的靜態方法。 單例模式的實現方式 餓漢式 類被加載時&#xff0c;就會實例…

Milvus 索引如何選擇

以下是幾種索引類型的特點及適用場景&#xff0c;可據此選擇&#xff1a; AUTOINDEX 特點&#xff1a;數據庫自動選擇合適索引類型&#xff0c;無需深入了解索引細節。適用場景&#xff1a;對索引知識了解有限&#xff0c;或不確定哪種索引適合當前數據和查詢需求&#xff0c…

CentOS 7 安裝教程

準備&#xff1a; 軟件&#xff1a;VMware Workstation 鏡像文件&#xff1a;CentOS-7-x86_64-bin-DVD1.iso &#xff08;附&#xff1a;教程較為詳細&#xff0c;注釋較多&#xff0c;故將操作的選項進行了加粗字體顯示。&#xff09; 1、文件–新建虛擬機–自定義 2、硬盤…

TAS啟動與卸載

3. 啟動TAS&#xff08;Thin-Agent服務&#xff09; TAS在安裝完成后通常會自動啟動&#xff0c;并在系統重啟時自啟。如需手動啟動&#xff0c;請按以下步驟操作&#xff1a; &#xfffc; 3.1 在Windows上啟動TAS 1. 打開 Windows服務管理器&#xff1a; ? 按下 Win R&…

Redis面試——數據結構

一、SDS如何防止緩沖區溢出&#xff1f; Redis 的 String 類型通過 SDS&#xff08;Simple Dynamic String&#xff09;來防止緩沖區溢出&#xff0c;具體機制如下&#xff1a; Redis 的 String 類型底層采用 SDS 實現&#xff0c;即 Simple Dynamic StringSDS 底層維護的數據…

Doris的向量化執行如何支撐分布式架構和復雜查詢

Doris 的向量化執行能力與其 分布式架構 和 復雜查詢優化 深度結合&#xff0c;通過 批處理 列式計算 分布式調度 的協同設計&#xff0c;解決傳統分布式數據庫在復雜查詢場景下的性能瓶頸。以下是具體原理展開&#xff1a; 一、向量化如何適配分布式架構&#xff1f; Doris…

DataInputStream 終極解析與記憶指南

DataInputStream 終極解析與記憶指南 一、核心本質 DataInputStream 是 Java 提供的數據字節輸入流,繼承自 FilterInputStream,用于讀取基本數據類型和字符串的二進制數據。 作用:1.專門用來讀取使用DataOutputStream流寫入的文件 注意:讀取的順序要和寫入的順序一致(…

云轉型(cloud transformation)——不僅僅是簡單的基礎設施遷移

李升偉 編譯 云轉型不僅僅是遷移基礎設施&#xff0c;更是重塑企業運營、創新及價值交付的方式。它具有戰略性、持續性&#xff0c;并影響著人員、流程和平臺。 ?? 云轉型涉及以下內容&#xff1a; &#x1f504; 應用現代化——從單體架構轉向微服務架構。 ?? 運營自動…

Java HTTP Client API詳解

Java HTTP Client API詳解 Java的HTTP客戶端API經歷了多次演進&#xff0c;從早期的HttpURLConnection到第三方庫如Apache HttpClient&#xff0c;再到Java 11引入的標準HttpClient。本文將全面解析Java中主要的HTTP客戶端API&#xff0c;包括特性對比、使用方法和最佳實踐。 …

如何深入理解引用監視器,安全標識以及訪問控制模型與資產安全之間的關系

一、核心概念總結 安全標識(策略決策的 “信息載體) 是主體&#xff08;如用戶、進程&#xff09;和客體&#xff08;如文件、數據庫、設備&#xff09;的安全屬性&#xff0c;用于標記其安全等級、權限、訪問能力或受保護級別&#xff0c;即用于標識其安全等級、權限范圍或約束…

京東3D空間視頻生成技術探索與應用

1. 背景 近年來&#xff0c;隨著社交媒體、流媒體平臺以及XR設備的快速發展&#xff0c;沉浸式3D空間視頻的需求迅猛增長&#xff0c;尤其是在短視頻、直播和電影領域&#xff0c;正在重新定義觀眾的觀看體驗。2023年&#xff0c;蘋果公司發布的空間視頻技術為這一趨勢注入了新…