如何處理緩存失效、緩存穿透、緩存并發(fā)等問題


緩存失效###

原因:引起這個原因的主要因素是高并發(fā)下,我們一般設(shè)定一個緩存的過期時間時,可能有一些會設(shè)置5分鐘啊,10分鐘這些;并發(fā)很高時可能會出在某一個時間同時生成了很多的緩存,并且過期時間在同一時刻,這個時候就可能引發(fā)——當(dāng)過期時間到后,這些緩存將同時失效。

影響:緩存同時失效時產(chǎn)生的雪崩效應(yīng),將所有請求全部放在數(shù)據(jù)庫上,這樣很容易就達到數(shù)據(jù)庫的瓶頸,導(dǎo)致服務(wù)無法正常提供。盡量避免這種場景的發(fā)生。

解決:一個簡單方案就是將緩存失效時間分散開,不要所以緩存時間長度都設(shè)置成5分鐘或者10分鐘;比如我們可以在原有的失效時間基礎(chǔ)上增加一個隨機值,比如1-5分鐘隨機,這樣每一個緩存的過期時間的重復(fù)率就會降低,就很難引發(fā)集體失效的事件。

緩存穿透###

場景:指查詢一個一定不存在的數(shù)據(jù),由于緩存是不命中時被動寫的,并且出于容錯考慮,如果從存儲層查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個不存在的數(shù)據(jù)每次請求都要到存儲層去查詢,失去了緩存的意義。

影響:當(dāng)在流量較大時,出現(xiàn)這樣的情況,一直請求DB,很容易導(dǎo)致服務(wù)掛掉。

解決:

  1. 在封裝的緩存SET和GET部分增加個步驟,如果查詢一個KEY不存在,就已這個KEY為前綴設(shè)定一個標(biāo)識KEY;以后再查詢該KEY的時候,先查詢標(biāo)識KEY,如果標(biāo)識KEY存在,就返回一個協(xié)定好的非false或者NULL值,然后APP做相應(yīng)的處理,這樣緩存層就不會被穿透。當(dāng)然這個驗證KEY的失效時間不能太長。

  2. 如果一個查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故障),我們?nèi)匀话堰@個空結(jié)果進行緩存,但它的過期時間會很短,一般只有幾分鐘。

  3. 采用布隆過濾器,將所有可能存在的數(shù)據(jù)哈希到一個足夠大的bitmap中,一個一定不存在的數(shù)據(jù)會被這個bitmap攔截掉,從而避免了對底層存儲系統(tǒng)的查詢壓力。

緩存并發(fā)###

場景:當(dāng)網(wǎng)站并發(fā)訪問高,一個緩存如果失效,可能出現(xiàn)多個進程同時查詢DB,同時設(shè)置緩存的情況,如果并發(fā)確實很大,這也可能造成DB壓力過大,還有緩存頻繁更新的問題。

解決:對緩存查詢加鎖,如果KEY不存在,就加鎖,然后查DB入緩存,然后解鎖;其他進程如果發(fā)現(xiàn)有鎖就等待,然后等解鎖后返回數(shù)據(jù)或者進入DB查詢。

來源:http://www.cnblogs.com/lingshao/p/5658757.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容