緩存雪崩解決方案:二級緩存VS隨機TTL

背景

在學習緩存雪崩的時候,了解到有二級緩存和隨機TTL兩個解決方案,但是在學習之后,個人認為二級緩存本質上還是利用兩層緩存的過期時間不一致來實現緩存過期時間隨機化,這不就是和隨機TTL一樣嗎,故有了這篇思考,如有不對,歡迎指正

緩存雪崩是什么

緩存雪崩指的是大量的緩存同時失效(過期)導致大量的請求直接到了數據庫,數據庫瞬間受到了很大的壓力,可能導致系統崩潰

或者是緩存層直接不提供服務宕機導致大量請求直接打到數據庫上,使得數據庫承受很大壓力

其中緩存雪崩解決方案有多種,其中兩種為

  • 二級緩存
  • 設置隨機ttl(隨機過期時間)

二級緩存是什么?

二級緩存指的是將兩個不同層次的緩存結合起來使用,是一種組合型分組的緩存結構,最常見的就是Redis+本地緩存(如Caffeine)。目的是通過分層設計,在內存與持久化緩存之間分擔壓力,提高系統的容錯能力與性能。(一般是采取熱點數據存儲到本地緩存,非熱點數據存儲到redis種)

常見的一個請求流程圖如下:

首先先查詢一級緩存,隨后如果讀取不到的話就讀取二級緩存,再沒有就去數據庫查詢并且將找到的數據寫入一二級緩存

代碼示例

 // 根據店鋪 ID 查詢店鋪信息public String queryShopById(Long id) {String cacheKey = CACHE_SHOP_KEY + id;// 1. 首先查詢 Caffeine 本地緩存String shop = caffeineCache.getIfPresent(cacheKey);if (shop != null) {System.out.println("從Caffeine緩存中查詢到數據...");return shop;}// 2. 如果 Caffeine 本地緩存沒有,從 Redis 查詢shop = redisTemplate.opsForValue().get(cacheKey);if (shop != null) {System.out.println("從Redis緩存中查詢到數據...");// Redis 命中,放入 Caffeine 本地緩存caffeineCache.put(cacheKey, shop);return shop;}// 3. 如果 Redis 和 Caffeine 都沒有,從數據庫查詢shop = getShopFromDatabase(id);if (shop != null) {// 數據庫查詢成功,將數據放入 Redis 和 Caffeine 緩存redisTemplate.opsForValue().set(cacheKey, shop, 10, TimeUnit.MINUTES);  // 設置 Redis 緩存有效期caffeineCache.put(cacheKey, shop);  // 將數據放入 Caffeine 本地緩存return shop;}return "店鋪不存在";}

二級緩存如何解決緩存雪崩的問題

(1) 緩存過期時間不一致,避免大規模并發請求(核心)
  • 為了避免緩存雪崩問題,Redis 緩存和 Caffeine 緩存的過期時間可以設置不同,而且本地緩存 Caffeine 還支持自動清除過期的緩存。這種不同的過期策略可以避免大量緩存同時過期。
  • 避免全量緩存同時失效:通過設計合理的過期時間,避免 Redis 和 Caffeine 緩存同時在同一時刻過期。比如,Redis 緩存設置為較長的過期時間(例如 10 分鐘),而 Caffeine 的過期時間較短(例如 1 分鐘)。這樣即使 Redis 緩存失效,本地緩存仍然能繼續工作,避免了緩存雪崩的發生。(caffeine可以通過設置expireAfter:基于個性化定制的邏輯來實現過期處理,靈活設置過期時間)
(2) Redis 緩存失效時,Caffeine 能接管
  • Redis 緩存失效時,由于本地緩存(Caffeine)的存在,查詢操作首先會嘗試從 Caffeine 獲取數據,這樣能夠在 Redis 緩存失效期間保證一定的服務可用性,并避免所有請求都落到數據庫上。
(3) Caffeine 本地緩存減少對 Redis 的壓力
  • Caffeine 作為本地緩存,存儲的是每個節點本地的數據,能夠極大地減少對 Redis 的訪問。
  • 即使 Redis 緩存失效(比如 Redis 發生故障或緩存過期),本地緩存 Caffeine 仍然可以繼續提供服務,避免了緩存失效后直接查詢數據庫的壓力。

隨機ttl是什么?

隨機 TTL(Time to Live)是設置緩存過期時間的一種策略,它通過給每個緩存設置一個 隨機的過期時間,來避免緩存過期時間集中在同一時刻。從而避免了大量緩存同時過期,避免了大量請求同時擊中數據庫的緩存雪崩問題。

一種常用的方案就是在集體的過期時間上各個添加一個隨機的時長從而實現隨機ttl

隨機ttl如何解決的緩存雪崩?

即時多個原本的緩存項的原本的過期時間相同,經過隨機化后,它們的實際過期時間就不同了,減少了集中過期概率

當緩存項過期,新的請求觸發從數據庫加載數據并更新緩存,避免了大規模同時從數據庫加載數據

示例代碼

public class CacheExample {private static final String CACHE_KEY = "shop_info:";private static final int MIN_TTL = 5; // 最小 TTL 時間(秒)private static final int MAX_TTL = 20; // 最大 TTL 時間(秒)private static Jedis jedis = new Jedis("localhost", 6379); // Redis 連接// 模擬查詢數據庫獲取數據private static String queryDatabase(Long id) {return "Shop Info for ID: " + id;}// 獲取緩存數據public static String getShopInfo(Long id) {String cacheKey = CACHE_KEY + id;// 嘗試從 Redis 獲取緩存數據String cachedData = jedis.get(cacheKey);if (cachedData != null) {System.out.println("從緩存獲取數據: " + cachedData);return cachedData;}// 如果緩存不存在,查詢數據庫String data = queryDatabase(id);// 設置緩存時,使用隨機的 TTL(過期時間)int ttl = new Random().nextInt(MAX_TTL - MIN_TTL + 1) + MIN_TTL;jedis.setex(cacheKey, ttl, data);System.out.println("從數據庫獲取數據并緩存: " + data);return data;}// 模擬調用緩存查詢public static void main(String[] args) {// 查詢 shop 1System.out.println(getShopInfo(1L));// 查詢 shop 2System.out.println(getShopInfo(2L));}
}

但是,經過看過兩種實現,其實仔細一看好像似乎隨機TTL和二級緩存的本質都是避免緩存同時過期來解決緩存雪崩的問題,保證緩存不會大量同一時刻失效,從而減少數據庫的訪問壓力,但是二者并非一致?

隨機TTL VS 二級緩存

1. 隨機 TTL 優勢:

  • 簡單實現:相比于二級緩存方案,隨機 TTL 不需要引入額外的緩存系統,只需調整緩存的過期策略即可,配置和實現較為簡單。
  • 降低緩存過期集中性:通過隨機化每個緩存項的過期時間,解決了大量緩存同時過期的問題,減少了對數據庫的壓力。

2. 二級緩存優勢:

  • 更高的可用性:二級緩存引入了本地緩存(如 Caffeine)和分布式緩存(如 Redis),即使 Redis 出現故障,本地緩存 Caffeine 仍然能繼續提供數據服務,確保系統高可用。
  • 更高的性能:本地緩存 Caffeine 可以極大降低 Redis 的訪問壓力,提升系統響應速度。
  • 數據一致性和實時更新:二級緩存可以通過合理的緩存更新機制和緩存失效策略,保持數據的一致性和及時更新,避免緩存和數據庫的不同步問題。

二者的核心區別:

緩存的可靠性和冗余

  • 隨機ttl只是通過在緩存失效時間引入隨機性避免緩存雪崩問題,但是這種方法只依賴單一緩存層,如果緩存層出現問題,整個緩存機制失效,所有請求直接訪問數據庫
  • 二級緩存而是通過兩層緩存系統提高緩存可靠性和容錯能力,即時一級緩存失效,應用依然能夠依賴另外一層緩存提供數據,避免了對數據庫的直接訪問,意味著即使分布式緩存(如 Redis)失效,應用也可以通過本地緩存繼續提供數據,保證系統的高可用性。

性能的優化:

本地緩存的延遲比redis更短,而且內存訪問速度極快,本地緩存是 非常有效的性能優化手段

總結

雖然 隨機 TTL二級緩存 都是解決 緩存雪崩 的有效手段,但它們的設計目標和適用場景有所不同。隨機 TTL 簡單有效,適用于單一緩存層的情況,尤其是 Redis。二級緩存通過結合 Redis 和本地緩存來增強系統的 容錯性、高可用性、性能優化 ,適用于更復雜和高并發的場景。

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

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

相關文章

Android View事件分發機制深度解析

在Android面試中,關于View事件分發機制的考察往往不僅限于基礎流程,更關注底層原理、性能優化和實際應用場景。以下是針對面試的全面回答策略: 一、基礎回答框架 核心三要素: 傳遞流程 "事件分發遵循Activity → Window →…

2829. k-avoiding 數組的最小總和

2829. k-avoiding 數組的最小總和 題目鏈接:2829. k-avoiding 數組的最小總和 代碼如下: class Solution { public:int minimumSum(int n, int k) {int m min(k / 2, n);return (m * (m 1) (k * 2 n - m - 1) * (n - m)) / 2;} };

phpStorm2021.3.3在windows系統上配置Xdebug調試

開始 首先根據PHP的版本下載并安裝對應的Xdebug擴展在phpStorm工具中找到設置添加服務添加php web page配置完信息后 首先根據PHP的版本下載并安裝對應的Xdebug擴展 我使用的是phpStudy工具,直接在php對應的版本中開啟xdebug擴展, 并在php.ini中添加如下…

LabVIEW永磁同步電機性能測試系統

開發了一種基于LabVIEW的永磁同步電機(PMSM)性能測試系統的設計及應用。該系統針對新能源汽車使用的電機進行穩態性能測試,解決了傳統測試方法成本高、效率低的問題,實現了測試自動化,提高了數據的準確性和客觀性。 ?…

谷粒商城:Redisson

目錄 Redisson 整合Redisson RLock RReadWriteLock RSemaphore RCountDownLatch 優化三級分類緩存 緩存一致性問題 雙寫模式 失效模式 臟數據解決 Redisson 提供redis分布式鎖(Distributed locks with Redis)的java客戶端 整合Redisson 引入 …

Linux系統調用編程

目錄 一. 理解進程和線程的概念。并在Linux系統下進行相應操作 1.1概念 1.1.1進程(Process) 1.1.2 線程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系統中各進程的編號pid 1.2.2用kill 命令終止一個進程pid 二. 解釋Linux的“虛擬內存管理”,它與stm32中的 真…

25-智慧旅游系統(協同算法)三端

介紹 技術: 基于 B/S 架構 SpringBootMySQLLayuivue 環境: Idea mysql maven jdk1.8 node 管理端功能 首頁展示圖表:以數據可視化方式展示關鍵業務數據。 用戶管理:管理系統用戶,包括查看、編輯等操作。 供應商管…

【stm32--HAL庫DMA+USART+空閑中斷不定長收發數據】

串口通信-Hal庫實現不定長度收發,DMAUSART DMA串口STM32CUBEMX配置(工程創建)基礎配置時鐘配置工程配置 代碼編寫現象 DMA 在正式配置之前,我們先來一起簡單了解一下DMA。DMA(Direct Memory Access,直接內…

沉浸式體驗測評|AI Ville:我在Web3小鎮“生活”了一周

最近,我在朋友的推薦下,體驗了 aivillebot 的項目。起初,我只是抱著試試看的心態,心想這不就是個 Web3 版的《星露谷物語》嗎? 但是一周下來,我發現這個虛擬小鎮也沒那么簡單——里面的居民不是目前端游或鏈…

FPGA學習-基于 DE2-115 板的 Verilog 分秒計數器設計與按鍵功能實現

一、核心功能設計 按鍵暫停/繼續:通過KEY1控制計時狀態 按鍵消抖處理:20ms消抖周期消除機械抖動 硬件資源分配:符合DE2-115開發板引腳規范 二、核心模塊實現詳解 1. 頂層模塊(counter) module counter(input CL…

后端開發 SpringBoot 工程模板

概述 本篇文章主要記錄如何開發一個通用的 SpringBoot 工程開發框架的項目模板,這樣后續需要開發項目時就可以直接開箱直用了,省區了很多重復步驟。 項目初始化 創建項目: 按照我的選項來選,然后點擊 create,等待文…

OpenCv(五)——邊緣檢測

目錄 邊緣檢測 一、sobel算子邊緣檢測 (1)原理 1、X軸方向的邊緣檢測 2、Y軸方向的邊緣檢測 (2)sobel算子參數 (3)X軸方向邊緣檢測代碼演示 1、顯示圓的圖像 2、x方向上的邊緣檢測&#xf…

無人機數據鏈技術及運行方式詳解!

一、無人機數據鏈技術要點 1. 通信傳輸技術 頻段選擇: 常用頻段包括 L波段(1-2 GHz)、C波段(4-8 GHz)、Ku/K波段(12-40 GHz),不同頻段在傳輸距離、帶寬和抗干擾性間權衡。 低…

AI Agent 實戰:搭建個人在線旅游助手

AI Agent 實戰:搭建個人在線旅游助手 本次實驗中,我們將繼續探索 Agent 的提示詞,學習更加規范的提示詞撰寫方法。 本實驗中你將掌握的知識點 使用 Dify 構建 Agent 的方法結構化的提示詞撰寫技巧變量的使用方法 1. 準備 在新建 Agent 之…

檢索增強生成(RAG):強化 AI 智能體的知識 “武裝”

技術點目錄 第一章、智能體(Agent)入門第二章、基于字節Coze 構建智能體(Agent)第三章、基于其他平臺構建智能體(Agent)第四章、國內外智能體(Agent)經典案例詳解第五章、大語言模型應用開發框架LangChain入門第六章、基于LangChain的大模型API接入第七章…

vscode 打開工程 看不到文件目錄

vscode 打開工程 看不到文件目錄 View->Explorer 快捷鍵:CtrlShiftE

厘米級定位賦能智造升級:品鉑科技UWB技術驅動工廠全流程自動化與效能躍升”

在智能制造中的核心價值體現在?高精度定位、流程優化、安全管理?等多個維度,具體應用如下: 一、?核心技術與定位能力? ?厘米級高精度定位? UWB技術通過?納秒級窄脈沖信號?(帶寬超500MHz)實現高時間分辨率,結合…

getID3獲取本地或遠程視頻時長

音頻文件也可使用,使用ffmeg安裝太復雜了 附ffmpeg方式:centos下安裝ffmpeg_yum安裝ffmpeg-CSDN博客 使用composer先安裝 composer require james-heinrich/getid3 獲取本地視頻 //獲取本地視頻$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…

10、Linux C 網絡編程(完整版)

1、網絡發展歷史和分層 1.1 Internet 的歷史 起源: 1957 年:蘇聯發射第一顆人造衛星 "Sputnik"。 1958 年:美國總統艾森豪威爾成立 DARPA(國防部高級研究計劃署)。 1968 年:DARPA 提出 "…

前端:開源軟件鏡像站 / 清華大學開源軟件鏡像站 / 阿里云 / 網易 / 搜狐

一、理解開源軟件鏡像站 開源軟件鏡像是指開源軟件在遠程服務器上的備份副本,允許用戶通過互聯網快速下載和安裝所需的軟件。在國內,有多個知名的開源軟件鏡像站,為開發者提供穩定、快速的開源軟件下載服務。 二、常見開源軟件鏡像站 序號…