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

2021-10-03 03:01:40 字數 2059 閱讀 8883

快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為小於0的資料或id為特別大等不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。舉例**:

/**

* 通過分類id查詢廣告集合

* @param categoryid 廣告分類id

* @return 廣告集合

*/public listfindcontentbyid(long contentcatid)

return contentlist;

}

上面**就存在快取穿透的問題,如果使用者查詢的分類id為-8,redis中不存在這個資料,那麼它就會去mysql資料庫中查詢。mysql裡面也不存在這個資料,所以返回的結果是null。然後把這個null以key-value存入到redis中。即redis中存乙個null值,redis是不會儲存null值的。因此,下一次從redis中查詢依舊是null值,則根據**邏輯又會去查mysql,形成乙個無限迴圈,就會導致mysql壓力巨大,這就是快取穿透問題。

①在介面層增加校驗,如對使用者進行鑑權校驗(是否能訪問這個介面),對查詢的id做基礎校驗,如id<=0,直接進行攔截。但這種方法遺漏乙個問題,那就是id值過大(大到資料庫中依舊不存在),我們沒辦法對id值過大進行校驗。

②在上面方法進行改進,當mysql中也查詢不到的時候,我們就往redis中存乙個不為null的值,這樣可以防止攻擊使用者反覆用同乙個id進行暴力攻擊。這種方法依舊存在問題,那就是如果攻擊使用者每次攻擊的id遞減或是遞增,每次的id不同,還是會去訪問mysql,然後還會使redis中儲存的資料飛漲。

/**

* 通過分類id查詢廣告集合

* @param categoryid 廣告分類id

* @return 廣告集合

*/public listfindcontentbyid(long contentcatid)

// 然後再存乙份到redis

redistemplate.boundhashops("content_list").put(contentcatid,contentlist);

} return contentlist;

}

③快取預熱,快取預熱就是將資料提前加入到快取中,當資料發生變更,再將最新的資料更新到快取。即我們在redis中查詢不到的時候也不再訪問mysql資料庫去查詢了,redis中沒有,那麼mysql中必定也沒有。

快取擊穿是指快取中沒有但資料庫中有的資料。這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。

快取穿透和快取擊穿的區別:

1、一般快取穿透是由惡意攻擊造成的,而快取擊穿則是由redis中不存在資料,資料庫中存在,且在某一時刻併發量較大造成。

2、一般快取穿透的方法都會傳乙個id之類的值過來,而快取擊穿的方法不會傳引數過來。

舉例**:

/**

* 查詢所有選單集合(導航欄資料)

* @return 選單集合

*/public listfindcattreename()

return cattreelist;

}

上面**就存在快取擊穿問題,而這個快取擊穿問題往往就是因為過期時間造成的。當redis中存的資料過期之後,在某一刻,10000個人同時訪問這個方法,由於redis中不存在資料,則這10000個人都會去訪問mysql資料庫,導致資料庫壓力巨大。

1、設定資料永不過期

2、快取預熱

3、加鎖:大量併發只讓乙個去查,其他人等待,查到以後釋放鎖,其他人獲取到鎖,先查快取,就會有資料,不用去db。同時,我們查詢db的時候需要在鎖內將資料加入快取之後再返回。不然的話,釋放鎖之後,資料還沒加入到快取,另外乙個執行緒還是會去訪問到db。

快取雪崩是指快取資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至宕機。和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。

1、快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。

2、設定資料永不過期

3、快取預熱

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

4 總結 一般企業都會用到mysql等關係型資料庫,當訪問量不大的時候還可以支撐 當併發量高的時候,比如商品搶購或者主頁訪問瞬間較大的時候,請求直接到達db,可能會導致系統效能急劇下降以致癱瘓。db是面向磁碟的,磁碟io是比較重的操作,效能較低。為了克服上述的問題,通常需要在客戶端和db之間引入一層...

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

指的是,redis快取中和資料庫中都沒有的資料,使用者不斷向伺服器發起請求,導致資料庫壓力過大。一般的流程查詢流程存在redis快取穿透bug 沒獲取到資料,到資料庫中查詢 如果一直沒獲取和查詢到資料,使用者不斷發起請求,資料庫就會不斷地進行查詢操作,導致資料庫壓力增大,導致快取擊穿。解決方案 阻止...

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

快取雪崩 同一時刻有大量key失效,導致大量請求到資料庫 解決方案1 key失效時間加上隨機值,或者更高階的演算法分散失效時間。解決方案2 沒有資料時也cache下,過期時間可設定短點,不把過多請求打到db去 快取穿透 當查詢redis中沒有的資料時,該查詢會下沉到資料庫層,同時資料庫層也沒有該資料...