7.緩存穿透、緩存擊穿、緩存雪崩

緩存穿透、緩存擊穿、緩存雪崩

1. 緩存穿透

緩存穿透是指緩存和數(shù)據(jù)庫(kù)中都沒(méi)有的數(shù)據(jù),而用戶(hù)不斷發(fā)起請(qǐng)求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時(shí)的用戶(hù)很可能是攻擊者,攻擊會(huì)導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大。

解決方案:

  1. 接口層增加校驗(yàn),如用戶(hù)鑒權(quán)校驗(yàn),id做基礎(chǔ)校驗(yàn),id<=0的直接攔截;(或者使用布隆過(guò)濾器在緩存層前攔截非法請(qǐng)求、自動(dòng)為空值添加黑名單,同時(shí)可能要為誤判的記錄添加白名單,但需要考慮布隆過(guò)濾器的維護(hù)。
  2. 從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫(kù)中也沒(méi)有取到,這時(shí)也可以將key-value對(duì)寫(xiě)為key-null,緩存有效時(shí)間可以設(shè)置短點(diǎn),如30秒(設(shè)置太長(zhǎng)會(huì)導(dǎo)致正常情況也沒(méi)法使用)。這樣可以防止攻擊用戶(hù)反復(fù)用同一個(gè)id暴力攻擊。

2. 緩存擊穿

緩存擊穿是指緩存中沒(méi)有但數(shù)據(jù)庫(kù)中有的數(shù)據(jù)(一般是緩存時(shí)間到期),這時(shí)由于并發(fā)用戶(hù)特別多,同時(shí)讀緩存沒(méi)讀到數(shù)據(jù),又同時(shí)去數(shù)據(jù)庫(kù)去取數(shù)據(jù),引起數(shù)據(jù)庫(kù)壓力瞬間增大,造成過(guò)大壓力。

解決方案:

  1. 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過(guò)期。

  2. 加互斥鎖,互斥鎖參考代碼如下:

    互斥鎖防止緩存擊穿

    這是簡(jiǎn)化處理,理論上如果能根據(jù)key值加鎖就更好了,就是線程A從數(shù)據(jù)庫(kù)取key1的數(shù)據(jù)并不妨礙線程B取key2的數(shù)據(jù),上面代碼明顯做不到這點(diǎn)。

3. 緩存雪崩

緩存雪崩是指緩存中數(shù)據(jù)大批量到過(guò)期時(shí)間,而查詢(xún)數(shù)據(jù)量巨大,引起數(shù)據(jù)庫(kù)壓力過(guò)大甚至down機(jī)。

和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過(guò)期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫(kù)。

解決方案:

  1. 緩存數(shù)據(jù)的過(guò)期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過(guò)期現(xiàn)象發(fā)生。
  2. 如果緩存數(shù)據(jù)庫(kù)是分布式部署,將熱點(diǎn)數(shù)據(jù)均勻分布在不同的緩存數(shù)據(jù)庫(kù)中。
  3. 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過(guò)期。

緩存雪崩在Redis中的解決方案:

  • 事前:Redis 高可用,主從 + 哨兵,集群,避免全盤(pán)崩潰。
  • 事中:本地 ehcache 緩存 + hystrix 限流 & 降級(jí),避免數(shù)據(jù)庫(kù)承受太多壓力崩掉。
  • 事后:Redis 持久化,一旦重啟,自動(dòng)從磁盤(pán)上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)。

上面在Redis中解決緩存雪崩的請(qǐng)求過(guò)程:

  1. 用戶(hù)請(qǐng)求先訪問(wèn)本地緩存,無(wú)命中后再訪問(wèn) Redis,如果本地緩存和 Redis 都沒(méi)有再查數(shù)據(jù)庫(kù),并把數(shù)據(jù)添加到本地緩存和 Redis;
  2. 由于設(shè)置了限流,一段時(shí)間范圍內(nèi)超出的請(qǐng)求走降級(jí)處理(返回默認(rèn)值,或給出友情提示)。

參考文檔:https://blog.csdn.net/kongtiao5/article/details/82771694

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

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

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