1 ?緩存穿透,DB壓力增大
? ? 常用的k-v型緩存,當查詢一個key而緩存中沒有value時,就會去database中查詢,如果惡意查詢會導致db壓力增大。
? ? 解決方法:
? ?1.空對象
? ? ? 碰到查詢結果為空的鍵,放一個空值在緩存中,下次再訪問就立刻知道這個鍵無效,不會再訪問DB。
? ? ? 空對象存在的問題:1.由于每個空k-v都會存在緩存中,所以空的查詢越多,緩存需求越大,可以通過設置過期時間來解決這個問題。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.因為設置了過期時間,當此時間段內再次查詢緩存時,就會直接返回空值,而此時間段內DB數據更改了,數據就會不一致,可以用消息(kafka)來同步或者清除對應的緩存。
? ?2.布隆過濾器
? ? ?(具體見下篇)
? ? ? 去重過濾,把所有鍵值放到布隆過濾器中,布隆過濾器每個請求會返回“在集合內(可能錯誤)”和“不在集合內(絕對不在集合內)”兩種情況,所以會過濾掉大部分空值的請求,只有少量的空值請求會穿透,減少了db的壓力。
2 ?緩存雪崩
首先緩存失效,比如并發請求很多時,某一時間查詢很多數據放到緩存并且設置了過期時間,當時間結束,緩存大片失效,后面的請求都會直接走向DB,一個簡單的方法是均衡過期時間,使緩存失效的時間段平衡。
當緩存服務重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,后端系統(比如DB)帶來很大壓力。可以對線程加鎖或者直接用隊列查詢DB,減小DB的壓力,缺點的增加了處理時間。可以做緩存服務器的主備,主緩存雪崩后走備用服務器,涉及到數據的一致性問題。