緩存篇—緩存雪崩

什么是緩存雪崩

通常我們為了保證緩存中的數據與數據庫中的數據一致性,會給 Redis 里的數據設置過期時間,當緩存數據過期后,用戶訪問的數據如果不在緩存里,業務系統需要重新生成緩存,因此就會訪問數據庫,并將數據更新到 Redis 里,這樣后續請求都可以直接命中緩存。

那么,當大量緩存數據在同一時間過期(失效)或者 Redis 故障宕機時,如果此時有大量的用戶請求,都無法在 Redis 中處理,于是全部請求都直接訪問數據庫,從而導致數據庫的壓力驟增,嚴重的會造成數據庫宕機,從而形成一系列連鎖反應,造成整個系統崩潰,這就是緩存雪崩的問題。

緩存雪崩的原因

可以看到,發生緩存雪崩有兩個原因:

  • 大量數據同時過期;
  • Redis 故障宕機;

不同的誘因,應對的策略也會不同。

大量數據同時過期

針對大量數據同時過期而引發的緩存雪崩問題,常見的應對方法有下面這幾種:

  • 均勻設置過期時間;
  • 互斥鎖;
  • 后臺更新緩存;

1. 均勻設置過期時間

如果要給緩存數據設置過期時間,應該避免將大量的數據設置成同一個過期時間。我們可以在對緩存數據設置過期時間時,給這些數據的過期時間加上一個隨機數,這樣就保證數據不會在同一時間過期。

2. 互斥鎖

當業務線程在處理用戶請求時,如果發現訪問的數據不在 Redis 里,就加個互斥鎖,保證同一時間內只有一個請求來構建緩存(從數據庫讀取數據,再將數據更新到 Redis 里),當緩存構建完成后,再釋放鎖。未能獲取互斥鎖的請求,要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認值。

實現互斥鎖的時候,最好設置超時時間,不然第一個請求拿到了鎖,然后這個請求發生了某種意外而一直阻塞,一直不釋放鎖,這時其他請求也一直拿不到鎖,整個系統就會出現無響應的現象。

3. 后臺更新緩存

業務線程不再負責更新緩存,緩存也不設置有效期,而是讓緩存“永久有效”,并將更新緩存的工作交由后臺線程定時更新

事實上,緩存數據不設置有效期,并不是意味著數據一直能在內存里,因為當系統內存緊張的時候,有些緩存數據會被“淘汰”,而在緩存被“淘汰”到下一次后臺定時更新緩存的這段時間內,業務線程讀取緩存失敗就返回空值,業務的視角就以為是數據丟失了。

解決上面的問題的方式有兩種。

第一種方式,后臺線程不僅負責定時更新緩存,而且也負責頻繁地檢測緩存是否有效,檢測到緩存失效了,原因可能是系統緊張而被淘汰的,于是就要馬上從數據庫讀取數據,并更新到緩存。

這種方式的檢測時間間隔不能太長,太長也導致用戶獲取的數據是一個空值而不是真正的數據,所以檢測的間隔最好是毫秒級的,但是總歸是有個間隔時間,用戶體驗一般。

第二種方式,在業務線程發現緩存數據失效后(緩存數據被淘汰),通過消息隊列發送一條消息通知后臺線程更新緩存,后臺線程收到消息后,在更新緩存前可以判斷緩存是否存在,存在就不執行更新緩存操作;不存在就讀取數據庫數據,并將數據加載到緩存。這種方式相比第一種方式緩存的更新會更及時,用戶體驗也比較好。

在業務剛上線的時候,我們最好提前把數據緩起來,而不是等待用戶訪問才來觸發緩存構建,這就是所謂的緩存預熱,后臺更新緩存的機制剛好也適合干這個事情。

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

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

相關文章

QEMU源碼全解析 —— virtio(22)

接前一篇文章:QEMU源碼全解析 —— virtio(21) 前幾回講解了virtio驅動的加載。本回開始講解virtio驅動的初始化。 在講解virtio驅動的初始化之前,先要介紹virtio配置的函數集合變量virtio_pci_config_ops。實際上前文書也有提到…

c# HttpCookie操作,建立cookie工具類

HttpCookie 是一個在.NET Framework中用于管理和操作HTTP Cookie的類。它提供了一種方便的方式來創建、設置、讀取和刪除Cookie。 Cookie是一種在客戶端和服務器之間傳遞數據的機制,用于跟蹤用戶的會話狀態和存儲用戶相關的信息。它通常由服務器發送給客戶端&#…

萬字干貨-京東零售數據資產能力升級與實踐

開篇 京東自營和商家自運營模式,以及伴隨的多種運營視角、多種組合計算、多種銷售屬性等數據維度,相較于行業同等量級,數據處理的難度與復雜度都顯著增加。如何從海量的數據模型與數據指標中提升檢索數據的效率,降低數據存算的成…

parallels配置centos虛擬環境

parallels Desktop M1/M2芯片Parallels Desktop 19虛擬機安裝使用教程(超詳細)-CSDN博客 下鏡像記得找和mac芯片匹配的 安裝就選第一個centos7不要選第二個 安裝有問題就選回退重啟 parallel desktop 18/19安裝centos7.2009教程_parallels desktop 19…

echarts多y軸樣式重疊問題

1、主要屬性設置 yAxis: [{//y軸1nameTextStyle: {align: "right",padding: 0}},{//y軸2nameTextStyle: {align: "left",padding: 0}},{//y軸3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

Python Web開發記錄 Day2:CSS

名人說:莫道桑榆晚,為霞尚滿天。——劉禹錫(劉夢得,詩豪) 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 目錄 二、CSS1、CSS-初始入門①快速了解②CSS應用方式…

【C語言】sizeof()函數

前言 sizeof函數用于獲取數據類型或變量在內存中所占的字節數。 sizeof函數返回的是編譯時確定的值,不會計算動態分配的內存大小。 sizeof函數可以用于多種類型的數據,包括數組、指針、結構體、枚舉等。 1.數組 int arr[5];printf("%zu ", siz…

文件上傳與下載

文件上傳與下載 1. 文件上傳 為了能上傳文件,必須將表單的 method 設置為 POST,并將 enctype 設置為 multipart/form-data 。 有兩種實現文件上傳的方式: 底層使用 Apache Commons FileUpload 包 底層使用 Servlet 3.1 內置的文件上傳功能…

如何計算文件哈希值(MD5值)

生成文件hash值的用途 哈希值,即HASH值,是通過對文件內容進行加密運算得到的一組二進制值,主要用途是用于文件校驗或簽名。正是因為這樣的特點,它常常用來判斷兩個文件是否相同。 比如,從網絡上下載某個文件&#xff0…

MySQL主從同步

MySQL主從同步(復制)是一種數據復制技術,用于將數據從一個MySQL數據庫(稱為“主”)復制到另一個或多個MySQL數據庫(稱為“從”)。這個過程通常用于負載均衡、數據備份、災難恢復和其他類似場景。…

C++ Primer Plus 筆記(持續更新)

編譯器的正解 數據+算法程序 賦值從右向左進行 cin,cout的本質也是對象 類和對象的解釋

centerOS docker搭建flowable,流程引擎

1、準備一個mysql數據庫,庫名為flowable 2、mysql驅動下載,下載地址為: https://mvnrepository.com/artifact/mysql/mysql-connector-java此處使用的是8.0.22版本的驅動,且數據庫必須使用版本8,否則第二次啟動報錯 3、…

OpenAI文生視頻大模型Sora概述

Sora,美國人工智能研究公司OpenAI發布的人工智能文生視頻大模型(但OpenAI并未單純將其視為視頻模型,而是作為“世界模擬器” ),于2024年2月15日(美國當地時間)正式對外發布。 Sora可以根據用戶…

samber/lo 庫的使用方法:type

samber/lo 庫的使用方法:type samber/lo 是一個 Go 語言庫,提供了一些常用的集合操作函數,如 Filter、Map 和 FilterMap。 這個庫函數太多,因此我決定按照功能分別介紹,本文介紹的是 samber/lo 庫中type相關的函數。匯…

Redis中的AOF重寫到底是怎么一回事

首先我們知道AOF和RDB都是Redis持久化的方法。RDB是Redis DB,一種二進制數據格式,這樣就是相當于全量保存數據快照了。AOF則是保存命令,然后恢復的時候重放命令。 AOF隨著時間推移,會越來越大,因為不斷往里追加命令。…

哪些行業適合做小程序?零售電商、餐飲娛樂、旅游酒店、教育生活、醫療保健、金融社交、體育健身、房產汽車、企管等,你的行業在其中么?

引言 在當今數字化時代,小程序成為了各行各業快速發展的數字工具之一。它的輕便、靈活的特性使得小程序在多個行業中找到了廣泛的應用。本文將探討哪些行業適合開發小程序,并介紹各行業中小程序的具體應用。 一、零售和電商 在當今數字化的商業環境中&…

C++ RAII

RAII定義 RAII(Resource Acquisition Is Initialization)是C編程中的一種重要的資源管理技術。它的核心思想是:資源的獲取應該在對象的構造階段進行,而資源的釋放則應該在對象的析構階段進行。通過利用C對象的生命周期和析構函數…

C#之WPF學習之路(2)

目錄 控件的父類 DispatcherObject類 DependencyObject類 DependencyObject 類的關鍵成員和方法 Visual類 Visual 類的主要成員和方法 UIElement類 UIElement 類的主要成員和功能 FrameworkElement類 FrameworkElement 類的主要成員和功能 控件的父類 在 WPF (Windo…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息隊列【分布式高級篇六】

目錄 1 消息隊列(Message Queue)簡介 1.1 概述 1.2 消息服務中兩個重要概念 1.3 消息隊列主要有兩種形式的目的地 1.4 JMS和AMQP對比 1.5 應用場景 1.6 Spring支持 1.7 SpringBoot自動配置 1.7 市面上的MQ產品 2 RabbitMQ 2.1 RabbitMQ簡介 2.1.1 RabbitMQ簡介 2…

什么是Elasticsearch SQL

什么是Elasticsearch SQL 一. 介紹二. SQL 入門 前言 這是我在這個網站整理的筆記,有錯誤的地方請指出,關注我,接下來還會持續更新。 作者:神的孩子都在歌唱 一. 介紹 Elasticsearch SQL 是一個 X-Pack 組件,允許針對 Elasticsea…