1、緩存穿透:
(1)問題描述:key對應的數據并不存在,每次請求訪問key時,緩存中查找不到,請求都會直接訪問到數據庫中去,請求量超出數據庫時,便會導致數據庫崩潰。如一個用戶id不存在,數據庫與緩存都不存在該id,此時黑客便可以利用此漏洞不斷訪問該id,造成數據庫崩潰。
(2)解決方法:
①對空值緩存:如果一個查詢數據為空(不管數據是否存在),都對該空結果進行緩存,其過期時間會設置非常短。
②設置可以訪問名單:使用bitmaps類型定義一個可以訪問名單,名單id作為bitmaps的偏移量,每次訪問時與bitmaps中的id進行比較,如果訪問id不在bitmaps中,則進行攔截,不給其訪問。
③采用布隆過濾器:布隆過濾器可以判斷元素是否存在集合中,他的優點是空間效率和查詢時間都比一般算法快,缺點是有一定的誤識別率和刪除困難。
④進行實時監控:對于redis緩存中命中率急速下降時,迅速排查訪問對象和訪問數據,將其設置為黑名單。
2.緩存擊穿:
(1)問題描述:key中對應數據存在,當key中對應的數據在緩存中過期,而此時又有大量請求訪問該數據,緩存中過期了,請求會直接訪問數據庫并回設到緩存中,高并發訪問數據庫會導致數據庫崩潰。
(2)解決方案:
①預先設置熱門數據:在redis高峰訪問時期,提前設置熱門數據到緩存中,或適當延長緩存中key過期時間。
②實時調整:實時監控哪些數據熱門,實時調整key過期時間。
③對于熱點key設置永不過期。
3、緩存雪崩·:
(1)問題描述:key中對應數據存在,在某一時刻,緩存中大量key過期,而此時大量高并發請求訪問,會直接訪問后端數據庫,導致數據庫崩潰。
注意:緩存擊穿是指一個key對應緩存數據過期,緩存雪崩是大部分key對應緩存數據過期
正常訪問下如圖:
緩存失效瞬間如下圖:
(2)解決方法:
①構建多級緩存機制:nginx緩存+redis緩存+其他緩存。
②設置過期標志更新緩存:記錄緩存數據是否過期,如果過期會觸發另外一個線程去在后臺更新實時key的緩存。
③將緩存可以時間分散:如在原有緩存時間基礎上增加一個隨機值,這個值可以在1-5分鐘隨機,這樣過期時間重復率就會降低,防止大量key同時過期。
④使用鎖或隊列機制:使用鎖或隊列保證不會有大量線程一次性對數據庫進行讀寫,從而避免大量并發請求訪問數據庫,該方法不適用于高并發情況。
---------------------
作者:后端小猿
來源:CSDN
原文:https://blog.csdn.net/weixin_50616848/article/details/123939734
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件