Redis 緩存問題及解決
一,緩存穿透(key在數(shù)據(jù)庫不存在)
當數(shù)據(jù)既不在緩存中,也不在數(shù)據(jù)庫中,導致請求訪問緩存沒數(shù)據(jù),訪問數(shù)據(jù)庫也沒數(shù)據(jù),即 每次都一穿到底。
當有大量這樣的請求到來時,數(shù)據(jù)庫的壓力驟增。
解決:
對請求過濾:參數(shù)檢查、黑名單、白名單等,直接拒絕。
緩存空值:對查詢不存在的數(shù)據(jù)也緩存下來(值為null),并設置較短過期時間。
使用布隆過濾器快速判斷數(shù)據(jù)是否存在,避免通過查詢數(shù)據(jù)庫來判斷(使用bitmaps實現(xiàn)):在寫入數(shù)據(jù)庫數(shù)據(jù)時,使用布隆過濾器做個標記,然后在用戶請求發(fā)現(xiàn)緩存沒有值時,查詢布隆過濾器快速判斷數(shù)據(jù)是否存在。
二,緩存擊穿(熱點key過期)
對于熱點數(shù)據(jù),當緩存失效的一瞬間,所有的請求都被下放到數(shù)據(jù)庫去請求更新緩存,數(shù)據(jù)庫被壓垮。
解決:
訪問數(shù)據(jù)庫加分布式鎖:獲得鎖的那個線程才能去訪問數(shù)據(jù)庫,并寫回緩存,其他線程等待。
熱點數(shù)據(jù)不過期:由后臺異步更新緩存,或者在熱點數(shù)據(jù)即將過期前,提前通知后臺線程更新緩存以及重新設置過期時間。
三,緩存雪崩(大量key同時過期)
當大量緩存在同一時間過期,如果此時有大量的用戶請求,瞬間所有的請求都被下放到數(shù)據(jù)庫,數(shù)據(jù)庫就崩掉了。
解決:
將緩存失效時間隨機打散 : 在原有的失效時間基礎上增加一個隨機值(比如1到10分鐘)這樣每個緩存的過期時間都不重復了,也就降低了緩存集體失效的概率。
緩存設置為不過期 : 通過后臺服務來更新緩存數(shù)據(jù)。
相關(guān)文章
redis-cli創(chuàng)建redis集群的實現(xiàn)
本文主要介紹了redis-cli創(chuàng)建redis集群的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06Redis總結(jié)筆記(二):C#連接Redis簡單例子
這篇文章主要介紹了Redis總結(jié)筆記(二):C#連接Redis簡單例子,需要的朋友可以參考下2015-01-01