緩存穿透、雪崩與擊穿

緩存穿透、雪崩、擊穿

  • 1、緩存穿透
    • 強調都沒有數據+并發訪問
    • 布隆過濾器
    • 緩存NULL值
  • 2、緩存雪崩
    • 強調批量Key過期+并發訪問
  • 3、緩存擊穿
    • 強調單個Key過期+并發訪問
    • 互斥鎖
    • 邏輯過期
  • 分布式并發控制

1、緩存穿透

緩存穿透是指數據庫和緩存都沒有的數據,這樣緩存永遠不會生效,大量的請求有可能導致數據庫宕機。

強調都沒有數據+并發訪問

一般處理緩存穿透有布隆過濾器 和 緩存null值 兩種方式。

布隆過濾器

布隆過濾器是使用一個初始全部是0的位數組,插入元素時先哈希一下,把哈希計算出的多個值的對應位置設為1,然后下次再有同樣的元素來時先計算一下,如果對應位置的位都是1那就代表有這個元素。這樣再去放行訪問reids。但布隆過濾器是存在誤判的可能性的,因為它走的是哈希思想,只要哈希思想,就可能存在哈希沖突。

緩存NULL值

第二種解決緩存穿透的方式就是:緩存空對象的思想比較簡單,查詢發現緩存和數據庫都沒有,就給緩存里加一個空值,下次這個請求再來直接返回緩存的空對象就行。但有個問題就是可能會造成短期內數據的不一致,比如緩存空對象的過期時間為10秒,如果在這10秒內底層數據發生了變化,而緩存層的查詢仍然會返回緩存的空對象,就會導致短期內數據不一致。

2、緩存雪崩

緩存雪崩是指,有很多數據,數據庫有,但緩存沒有(比如同時失效或者Redis服務宕機),導致這些大量的請求不走redis而是直接去查數據庫的情況

強調批量Key過期+并發訪問

多層級緩存,或者也可以給不同的Key的TTL添加隨機值

3、緩存擊穿

緩存擊穿是指,數據庫有,但緩存沒有的某個熱點數據,突然失效,導致的大量這個key請求不走redis而是直接去查數據庫的情況。

強調單個Key過期+并發訪問

【之所以會出現這個緩存擊穿問題,主要原因是在于我們對key設置了過期時間,假設我們不設置過期時間,其實就不會有緩存擊穿的問題,但是不設置過期時間,數據就會一直占用我們內存】
出現這種問題之后,當然是需要把熱點數據回寫到緩存里,那這就會有并發寫的問題。
一般處理方案是1互斥鎖,2邏輯過期

互斥鎖

只要它們使用同一把鎖,就能保障共享資源的正確性和一致性。
互斥鎖實現簡單,因為僅僅只需要加一把鎖,不用其他的操作了,但它只能串行執行,性能肯定受到影響。

邏輯過期

邏輯過期指的是,我們把過期時間設置在value中。假設線程1去查詢緩存,從value中判斷出來當前的數據已經過期了,那它就會去獲得互斥鎖,然后專門開啟一個新線程11去進行重構數據的邏輯,而線程1此時不等了直接返回過期的舊數據,直到新開的線程完成這個邏輯后,才會釋放鎖。在這個過程當中如果線程2過來訪問,由于線程線程11持有著鎖,所以線程2無法獲得鎖,也直接返回舊數據,只有等到新開的線程11把重建數據構建完后,之后其他線程才能返回正確的數據。
邏輯過期的優點在于它更新緩存的操作是異步進行的,其他線程不用等待。缺點在于在構建完緩存之前,返回的都是臟數據。

分布式并發控制

分布式鎖的核心思想在于所有線程都共享同一把鎖。

  • 實現的方式是使用redis中的 SET NX命令獲取鎖,這個命令可以保證互斥性,只有一個線程能夠成功獲取鎖。
    為了避免死鎖情況的發生,在線程拿鎖的同時也設置鎖的過期時間,這樣即使系統發生故障也能保證鎖在一定時間后自動釋放。
  • 還有就是在分布式條件下,可能會出現一些極端情況,【A線程拿到鎖然后阻塞了,時間到了之后鎖過期被放掉。然后B線程獲取到互斥鎖開始執行邏輯,A線程這時候恢復了,又繼續執行然后把B的鎖釋放掉】。那為了解決這種情況拿鎖的時候存進自己的線程標識,在釋放鎖時,先驗證一下這把鎖是不是自己存的,確定后才刪除,這樣就不會出現刪除別的線程鎖的情況。
  • 除此之外,會有一個拿鎖-比鎖-釋放的過程,為了避免出現在這個過程還沒走完系統宕機或者其他極端情況影響系統的可靠性,拿鎖-比鎖-釋放的代碼封裝到一個lua腳本里,這樣代碼執行的時候就能保證它的原子性。
    基于setnx實現的分布式鎖存在下面的問題:
    1、主從一致性問題: 如果Redis提供了主從集群,當我們向集群寫數據時,主機需要異步的將數據同步給從機,而萬一在同步過去之前,主機宕機了,就會出現數據不一致問題。
    2、可重入問題:同一個線程在持有鎖的情況下可以繼續執行需要獲取同一鎖的代碼,而不會被阻塞。可重入鎖有助于避免死鎖和提高代碼的靈活性。(lua里拿鎖,當鎖已經存在時,判斷傳入的線程標識是否相等,如果相等代表就是可重入鎖返回1代表獲取到了鎖,并且重置過期時間)

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

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

相關文章

圖形化用戶界面-java頭歌實訓

圖形化用戶界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

服務器raid5壞盤-換盤-修復陣列過程

目錄 背景原因分析解決步驟名詞解釋進入raid管理界面換回舊4號,進行import再次更換4號盤 總結 背景 服務器除塵之后文件服務器部分文件不能訪問了,部分文件夾內容為空,起初以為是新配置的權限的問題,排查之后發現不僅僅是權限問題 jumpserv…

ISA95-標準2-數據字典部分的解析與設計指南

在 MES/MOM 系統中,ISA-95 第二部分的數據字典扮演著至關重要的角色,它確保了數據的一致性和準確性,為不同系統間的數據交換提供了標準化的術語和定義。以下是 MES/MOM 系統實現 ISA-95 第二部分數據字典的具體概念、功能模塊以及應用場景: 一、概念、功能模塊以及應用場景…

numpy - array(4)

arr1 np.array([[1, 2], [3, 4], [5, 6]]) (1)def insert(arr, obj, values, axisNone) 向array指定位置插入指定值 axis為默認值None時,如果array是多維數據,則先將array轉化成向量obj:插入的索引,接受int或者多…

VTK學習日志:基于VTK9.3.0+Visual Studio c++實現DICOM影像MPR多平面重建+V R體繪制4個視圖展示功能的實現(二)

前段時間對VTK9.3.0進行了編譯,開發了MPRVR實現的demo,顯示效果不是很理想,正好趁著周末有時間,再度對之前的程序進行優化和完善,先展示下效果: VTK實現MPRVR四視圖 再次講解下基于VTK的MPRVR實現的簡單項目創建過程&a…

linux守護進程生命周期管理-supervisord

簡介 supervisor是一個client/server系統,允許用戶控制多個類unix系統的進程,擺脫rc.d腳本的不方便性.supervisor具有簡單,集中化管理,搞笑,可擴展性,高兼容. 整套軟件包含:supervisord(守護進程),supervisorctl(命令行工具),web server(一個web交互界面),XML-RPC 交互 安裝 …

git回退commit的方式

在Git中,回退commit(即撤銷之前的提交)可以通過多種方式來實現。以下是一些常見的方法,以及它們的詳細步驟和注意事項: ### 1. 使用git revert命令 git revert命令用于撤銷某次commit,但它并不會刪除該comm…

FFmpeg 硬件編碼加速文檔介紹

介紹 硬件訪問:許多平臺提供了對專用硬件的訪問,這些硬件可以用于執行解碼、編碼或過濾等視頻相關操作。 性能與資源使用:使用硬件可以加快某些操作的速度或減少其他資源(特別是CPU)的使用,但可能會產生不同的結果或質量較低,或帶來在使用純軟件時不存在的額外限制。 硬…

公爹公婆出首付買房,離婚的兒媳婦能分嗎?

小兩口結婚后為了更好地生活打算購房,男方父母幫助支付首付款,后房屋登記在夫妻名下。后兩人因感情不和打算離婚,女方要求按照房屋的現行價值進行分割,能否得到支持?近日,江蘇省南通市中級人民法院對這起離…

【Postman學習】

Postman是一個非常流行的API開發和測試工具,廣泛用于Web服務的開發、測試和調試。它提供了一個圖形界面,允許用戶輕松地構建、發送和管理HTTP(S)請求,同時查看和分析響應。下面是對Postman接口測試工具的詳細解釋: 1. Postman簡介…

Linux安裝Node-RED并實現后臺運行及開機啟動

首先確保系統中已近成功安裝Node.js,并保證需要的合適版本: 關于node.js的安裝可以參考我的另一篇博文:《AliyunOS安裝Node.js》。 然后就可以使用npm工具安裝Node-RED了,很簡單使用如下命令: sudo npm install -g --unsafe-per…

【代碼隨想錄算法訓練Day53】LeetCode 739.每日溫度、LeetCode 496.下一個更大元素、LeetCode 503. 下一個更大元素 II

Day53 單調棧 LeetCode 739.每日溫度 經典的單調棧題目&#xff0c;確實的感受到了單調棧的強大之處。 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> res(temperatures.size…

php+redis 生成二維碼庫

項目場景&#xff1a; 活動報名二維碼&#xff0c;生成 30W 的二維碼量存放到 redis 中&#xff0c;并通過 redis 讀取&#xff0c;以減輕 mysql 數據庫的壓力。 實現很簡單&#xff0c;分為兩步&#xff1a; 1、生成&#xff1a;通過 for 循環&#xff0c;以集合方式插入到…

MATLAB使用系統辨識工具箱建立PID水溫的傳遞函數系數

概述 利用PID控制水溫&#xff0c;由于實際在工程項目中&#xff0c;手動調節PID參數比較耗費時間&#xff0c;所以可以先利用MATLAB中的Simulink軟件建立模型&#xff0c;先在仿真軟件上調節大概的PID參數&#xff0c;再利用此PID參數為基礎在實際的工程項目中手動調節PID參數…

這些并發編程技術你都知道嗎?

與其碌碌無為&#xff0c;不如興風作浪。 雖然不是所有的系統都需要很多的并發編程技術&#xff0c;但是掌握常見的高并發秘籍&#xff0c;便能讓我們的系統快起來&#xff0c;面對訪問量的劇增從容應對。 接下來&#xff0c;為我們一起來看看常見的高并發技術有哪些。總結起來…

SSH版本升級-openssh-9.7p1

SSH版本升級-openssh-9.7p1 1、查看當前版本2、安裝openssl2.1、編譯安裝ssl 3、下載新版本SSH4、備份原有的SSH配置5、上傳文件并解壓6、卸載原有的openssh包7、編譯安裝openssh7.1、在解壓后的目錄&#xff0c;初始化openssh7.2、將文件拷回7.3、修改配置文件 最終實現&#…

linux系統中給java 應用配置開機自動啟動

第一步需要一個控制java應用啟動&#xff0c;停止&#xff0c;重啟的腳本&#xff0c;腳本內容如下&#xff0c;我是springboot應用&#xff0c;其他的可以根據情況改寫. #!/bin/bashAPP_NAME/data/oa/start-2.0.jar #執行命令有誤時&#xff0c;提示使用說明參數 usage() {ec…

DDD學習筆記五

模型引力場&#xff1a;聚合 強作用力體現&#xff1a; 某個領域模型是另一些模型存在的前提&#xff0c;沒有前者&#xff0c;后者就失去了生存的意義。 一組領域模型之間存在關聯的領域邏輯&#xff0c;任何時候都不能違反。 一組領域模型必須以一個完整的、一致的狀態呈現給…

CSDN寫文章時需要上、下標字號怎么輸?

上標&#xff1a;?^^&#xff0c;符號中間加字 下標&#xff1a;~~&#xff0c;符號中間加字 前題是用MD編輯器&#xff0c;不然白搭&#xff1a; 我是感覺CSDN這個文本編輯比較拉&#xff0c;非常想吐槽。

dB分貝入門

主要參考資料&#xff1a; dB&#xff08;分貝&#xff09;定義及其應用: https://blog.csdn.net/u014162133/article/details/110388145 目錄 dB的應用一、聲音的大小二、信號強度三、增益 dB的應用 一、聲音的大小 在日常生活中&#xff0c;住宅小區告知牌上面標示噪音要低…