redis緩存穿透與緩存雪崩

一、緩存穿透

所謂緩存穿透,即當請求訪問的數據在緩存中不存在時,需要訪問數據庫,當這種情況大量存在時(比如黑客蓄意攻擊),會造成數據庫訪問量集聚增加,進而導致數據庫異常,稱之爲緩存穿透。

解決方法:

1、數據訪問時不管有沒有獲取到查詢結果,都將其值存儲到緩存中,沒有查詢到結果時,將其值存儲爲null,這樣每次請求都會在緩存中命中,此時要注意,緩存中的null值,其過期時間不應設置過長。

2、訪問數據庫時,加個互斥鎖,先獲得鎖者訪問數據庫,後來者自旋或等待直至前者釋放鎖,這樣就能保證數據庫訪問量的驟然增加。互斥鎖,推薦使用redis的setnx的方式加鎖,具體使用可參考https://blog.csdn.net/zeb_perfect/article/details/54135506

3、提供一個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的Key是否合法有效。如果不合法,則直接返回。(布隆過濾器參考:https://www.cnblogs.com/CodeBear/p/10911177.html

二、緩存雪崩

所謂緩存雪崩,即當大量的緩存數據同時過期時,會存在同一段時間數據庫的訪問量驟然增加,導致數據庫崩潰的現象,稱之爲緩存雪崩。

解決方法:

1、給緩存設置失效時間時用隨機值的方式生成,避免大量緩存數據同時失效。

2、用互斥鎖的方式,緩存穿透中的第二個方法同樣適用。

3、設置雙緩存或者二級緩存,一個過期時間可以短一點,另一個過期時間長一些,原則是兩個不同時失效,定時用異步線程的方式讀取數據庫更新緩存,更新緩存時同時更新兩個緩存,這樣當請求訪問短期緩存失效時可以訪問長期緩存,不會導致數據庫訪問量驟然增加。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章