高併發下,如何防止快取被「擊穿」

2021-08-28 01:50:38 字數 835 閱讀 6467

對於一些設定了過期時間的key,如果這些key可能會在某些時間點被超高併發地訪問,是一種非常「熱點」的資料。這個時候,需要考慮另外乙個問題:快取被「擊穿」的問題。

/**

* 啟用新的get方法,防止快取被「擊穿」

* * 擊穿 :快取在某個時間點過期的時候,恰好在這個時間點對這個key有大量的併發請求過來,

* 這些請求發現快取過期一般都會從後端db載入資料並回設到快取,這個時候大併發的請求可能會瞬間把後端db壓垮。

* 如何解決:業界比較常用的做法,是使用mutex。

* 簡單地來說,就是在快取失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用快取工具的某些帶成

* 功操作返回值的操作(比如redis的setnx或者memcache的add)去set乙個mutex key,當操作返回成功時,再進行

* load db的操作並回設快取;否則,就重試整個get快取的方法。

* * @param key

* @param pjp

* @param cache

* @return

* @throws throwable

*/private object get(final string key, final proceedingjoinpoint pjp, final cacheable cache) throws throwable else

cacheutils.del(keynx);

return value;

} else

} else

}

高併發下快取穿透 快取雪崩,快取擊穿

併發進來後第乙個請求到達資料庫後,得到的資料並不存在,那麼這時返回null,這個null也會同時存在快取中,然而做快取判斷是,快取中為null就會去資料庫中查詢,那麼這時後面的併發,在來查詢這個不存在的資料是都會進入資料庫 導致資料庫壓力過大,從而導致系統崩潰 快取的key大面積的失效,如100萬的...

高併發下快取技術應用

背景 在某些電商促消活動中需要搞活動,對某些頁面的訪問量 qps 往往會非常高。如果直接讀資料庫,肯定db會承受不住。那比較常見的方案就是讓大部分相同資訊的請求都盡可能壓在cache上來緩解db的壓力,從而盡可能去滿足高併發訪問的需求 優化 這種快取技術一般用於不會經常變動資訊,並且訪問次數較多的頁...

高併發下快取失效問題

快取穿透 指查詢乙個一定不存在的資料,由於快取是不命中,將去查詢資料庫,但是資料庫也無此記錄,我們沒有將這次查詢的null寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義 風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰 解決 null結果快取,並加入短...