快取穿透 快取擊穿 快取雪崩概念區分

2021-10-08 20:04:29 字數 1962 閱讀 9315

在redis中,快取穿透、快取擊穿、快取雪崩是三個不同的概念,三者十分接近卻又區別明顯,大部分人對三者的概念還比較模糊,本文將詳述一下三者的區別、誘因以及解決方案。

2.1 概念

快取擊穿是訪問的資料不存在,也就是在redis快取中查詢不到資料,就會去請求資料庫查詢,但是資料庫也可能不存在,因此就會每次去請求資料庫,導致對資料庫伺服器造成壓力。通常此類資料的出現量是乙個較低的值,如果大規模出現,則可能是有人惡意攻擊。

2.2 後果

資料庫伺服器器壓力倍增,可能會造成資料庫伺服器宕機。

2.3 解決方案

(1)快取空值

快取一些經常被訪問的key為空值null,這樣在訪問快取時就被攔截過濾到,避免去訪問資料庫,為了防止這些key會儲存資料,因此需要設定key的過期時間。

(2)布隆過濾器(bloomfilter)

bloomfilter 類似於乙個hbase set 用來判斷某個元素(key)是否存在於某個集合中,把有資料的key都放到bloomfilter中,每次查詢的時候都先去bloomfilter判斷,如果沒有就直接返回null。由於bloomfilter沒有刪除操作,對於被刪除的key,查詢仍舊會經過快取和資料庫,所以對於那些已被刪除的key,可以在快取中快取null。

3.1 概念

redis中某個key過期了,但該key訪問量巨大,多個資料請求從伺服器來請求redis資料均未命中,於是redis在短時間內發起大量對資料庫中統一資料的訪問。

3.2 後果

資料庫伺服器在短時間內接收到大量請求,可能造成宕機。

3.3 解決方案

(1)預先設定:預先設定可能要被大量訪問值的key為永久key;

(2)現場調整:監控訪問量,對自然流量激增的資料延遲過期時間或設定為永久key;

(3)後台重新整理資料:啟動定時任務,高峰期來臨之前,重新整理資料有效期,確保不丟失;

(4)二級快取:設定不同的失效時間,保障不會被同時淘汰就行;

(5)加鎖:分布式鎖,防止被擊穿,但是要注意也會是效能瓶頸。

4.1 概念

快取雪崩指的是短時間內,快取中有大量的key幾種過期,此週期內請求訪問呢過期的資料,redis均為命中,於是向資料庫獲取資料,資料庫同時收到大量的請求無法及時處理,造成redis大量請求被積壓,開始出現了超時現象,資料庫同時壓力劇增,面臨崩潰。

4.2 後果

(1)redis伺服器資源被嚴重占用,redis伺服器崩潰;

(2)redis集群呈現崩塌,集群瓦解;

(3)應用伺服器無法及時得到資料響應的請求,來自客戶端的請求數量越來越多,應用伺服器奔潰;

(4)應用伺服器,redis,資料庫全部重啟,效果不理想。

4.3 解決方案

(1)更多的頁面靜態化處理;

(2)構建多級快取架構:nginx快取+redis快取+ehcache快取;

(3)檢測mysql嚴重耗時業務進行優化:對資料庫的瓶頸排查(例如超時查詢、耗時較高事務等);

(4)災難預警機制:監控redis伺服器效能指標、cpu占用、cpu使用率、記憶體容量、查詢平均響應時間、執行緒數;

(5)限流與降級:短時間範圍內犧牲一些客戶體驗,限制一部分請求訪問,降低應用伺服器壓力,待業務低速運轉後再逐步放開訪問。

其實可以根據名稱來見名知意:

(1)快取穿透:穿透,顧名思義,就是redis和資料庫都沒有,所以就是被穿透了啊;

(2)快取擊穿:擊穿就是單點集中式訪問,所有就被擊穿了,這種肯定是某個key失效導致的啊;

(3)快取雪崩:雪崩是大規模式的,普遍式和災難式的,因此肯定是大規模失效狀態,此處可記為大規模redis的key被乾掉了,也就是大規模失效了。

(1)

快取穿透 快取擊穿 快取雪崩

一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...

快取穿透,快取擊穿,快取雪崩

所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...

快取穿透快取擊穿快取雪崩

1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...