快取穿透與快取雪崩的解決方案

2021-10-08 11:26:02 字數 1212 閱讀 6708

快取穿透是指使用者查詢個別key時,該key不存在,導致使用者請求轉向資料庫查詢,而資料庫中也不存在,那麼該key對應的value就一直不會被快取,從而導致所有針對該key的請求全部轉向資料庫查詢,使整個快取系統對該key失去作用,我們稱這種現象為快取穿透。

那麼快取穿透一般該如何解決呢?

通常來說,目前業內比較常見的方法有兩種:

a、快取空的物件;

快取空的物件,這就意味著,當使用者請求了不存在的key時,我們在快取中存在乙個空值物件。這麼做其實有如下問題:

(1)、如果空值的物件過多,仍然可能導致快取系統的記憶體空間被占用,增加快取系統的壓力。

(2)、而且當資料庫中擁有了該key對應的非空value時,在過期時間到來之前,仍然同樣會存在資料不一致的情況。

b、採用布隆過濾器過濾掉針對不存在的key的查詢請求。

我們這裡就不聊布隆過濾器的原理了,讀者有興趣,可以自己另行去研究一下。

採用這種辦法,我們可以有效的將大量針對不存在的key的查詢請求直接給過濾掉。

這種辦法有這些好處:

(1)、不用浪費更多的快取空間去儲存空值的kv對;

(2)、有效減少針對快取系統的查詢請求。

但這種辦法,也有一些缺點:

(1)、由於布隆過濾器的假陽性率問題,導致並不能過濾掉100%的針對不存在value的key的查詢請求。

(2)、如果之前不存在value的key,在某乙個時間,它在資料庫中有了對應的value之後呢,那麼我們需要保持對布隆過濾器中bitmap的資料更新,否則會出現過濾掉存在value的key的情況。

快取雪崩是什麼呢?它也是快取穿透的一種極端情況,通常由於大量的key同時過期或者快取系統的宕機等原因,導致快取系統幾乎失去作用,引發大量的請求轉向資料庫查詢,大量請求針對資料庫的查詢,有可能引發資料庫系統的崩潰,而資料庫系統的崩潰還有可能引發一連串的依賴資料庫系統的應用的崩潰,故稱為雪崩。

為了解決快取雪崩問題,通常可以採用下面三種辦法:

a、保證快取系統的高可用(如何保證,是另外的話題,我們會在其它的文章中予以討論);

b、資料預熱,在系統啟動階段,我們就提前初始化好快取系統中的資料,保證使用者的大量請求過來可以命中快取;

c、避免所有的熱點key的集中過期,也就是我們可以將這些key的過期時間,設定為不同的過期時間,通常設定為乙個固定時間值+乙個隨機的時間段。

具體如何選取,需要根據我們業務要求來進行權衡,但是一定要盡量避免我們的系統中發生快取雪崩的現象,因為一旦發生,它就是巨大的災難。

快取雪崩,快取穿透解決方案

負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分析使用者行為,盡量讓失效時間點均勻分布。避免快取雪崩的出現。3,如果是因為某台快取伺服器宕機,可以考慮做主備,比如 red...

快取雪崩,快取穿透解決方案

快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...

快取雪崩,快取穿透解決方案

解決辦法 對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄。2.快取失效 如果快取集中在一段時間內失效,db的壓力凸顯。這個沒有完美解決辦法,但可以分析使用者行為,盡量讓失效時間點均勻分布。快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都...