Redis——缓存击穿、穿透、雪崩
1、緩存穿透:
(1)問題描述:key對應(yīng)的數(shù)據(jù)并不存在,每次請求訪問key時(shí),緩存中查找不到,請求都會直接訪問到數(shù)據(jù)庫中去,請求量超出數(shù)據(jù)庫時(shí),便會導(dǎo)致數(shù)據(jù)庫崩潰。如一個(gè)用戶id不存在,數(shù)據(jù)庫與緩存都不存在該id,此時(shí)黑客便可以利用此漏洞不斷訪問該id,造成數(shù)據(jù)庫崩潰。
(2)解決方法:
①對空值緩存:如果一個(gè)查詢數(shù)據(jù)為空(不管數(shù)據(jù)是否存在),都對該空結(jié)果進(jìn)行緩存,其過期時(shí)間會設(shè)置非常短。
②設(shè)置可以訪問名單:使用bitmaps類型定義一個(gè)可以訪問名單,名單id作為bitmaps的偏移量,每次訪問時(shí)與bitmaps中的id進(jìn)行比較,如果訪問id不在bitmaps中,則進(jìn)行攔截,不給其訪問。
③采用布隆過濾器:布隆過濾器可以判斷元素是否存在集合中,他的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般算法快,缺點(diǎn)是有一定的誤識別率和刪除困難。
④進(jìn)行實(shí)時(shí)監(jiān)控:對于redis緩存中命中率急速下降時(shí),迅速排查訪問對象和訪問數(shù)據(jù),將其設(shè)置為黑名單。
2.緩存擊穿:
(1)問題描述:key中對應(yīng)數(shù)據(jù)存在,當(dāng)key中對應(yīng)的數(shù)據(jù)在緩存中過期,而此時(shí)又有大量請求訪問該數(shù)據(jù),緩存中過期了,請求會直接訪問數(shù)據(jù)庫并回設(shè)到緩存中,高并發(fā)訪問數(shù)據(jù)庫會導(dǎo)致數(shù)據(jù)庫崩潰。
?
(2)解決方案:
①預(yù)先設(shè)置熱門數(shù)據(jù):在redis高峰訪問時(shí)期,提前設(shè)置熱門數(shù)據(jù)到緩存中,或適當(dāng)延長緩存中key過期時(shí)間。
②實(shí)時(shí)調(diào)整:實(shí)時(shí)監(jiān)控哪些數(shù)據(jù)熱門,實(shí)時(shí)調(diào)整key過期時(shí)間。
③對于熱點(diǎn)key設(shè)置永不過期。
3、緩存雪崩·:
(1)問題描述:key中對應(yīng)數(shù)據(jù)存在,在某一時(shí)刻,緩存中大量key過期,而此時(shí)大量高并發(fā)請求訪問,會直接訪問后端數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫崩潰。
注意:緩存擊穿是指一個(gè)key對應(yīng)緩存數(shù)據(jù)過期,緩存雪崩是大部分key對應(yīng)緩存數(shù)據(jù)過期
正常訪問下如圖:
緩存失效瞬間如下圖:
?
(2)解決方法:
①構(gòu)建多級緩存機(jī)制:nginx緩存+redis緩存+其他緩存。
②設(shè)置過期標(biāo)志更新緩存:記錄緩存數(shù)據(jù)是否過期,如果過期會觸發(fā)另外一個(gè)線程去在后臺更新實(shí)時(shí)key的緩存。
③將緩存可以時(shí)間分散:如在原有緩存時(shí)間基礎(chǔ)上增加一個(gè)隨機(jī)值,這個(gè)值可以在1-5分鐘隨機(jī),這樣過期時(shí)間重復(fù)率就會降低,防止大量key同時(shí)過期。
④使用鎖或隊(duì)列機(jī)制:使用鎖或隊(duì)列保證不會有大量線程一次性對數(shù)據(jù)庫進(jìn)行讀寫,從而避免大量并發(fā)請求訪問數(shù)據(jù)庫,該方法不適用于高并發(fā)情況。
---------------------
作者:后端小猿
來源:CSDN
原文:https://blog.csdn.net/weixin_50616848/article/details/123939734
版權(quán)聲明:本文為作者原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
內(nèi)容解析By:CSDN,CNBLOG博客文章一鍵轉(zhuǎn)載插件
總結(jié)
以上是生活随笔為你收集整理的Redis——缓存击穿、穿透、雪崩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]LVS负载均衡(LVS简介、三种工
- 下一篇: 基于mysql数据库的应用_MySQL数