在分布式快取需要解決快取一致性、快取淘汰、快取高可用等問題。還有常見的快取穿透、快取擊穿、快取雪崩這些問題需要解決和處理。我們這裡就對快取穿透、快取擊穿、快取雪崩進行解釋和研究。
快取穿透:快取穿透是指大量的不存在的資料查詢資料沒有命中快取,直接查詢到資料庫。這樣會導致資料查詢量增大,資料庫壓力會增加,影響到系統的整體效能。
快取擊穿:快取擊穿是指在同一時間大量的查詢同乙個key時,由於某些原因key失效了,導致所有的查詢都查詢資料庫。這裡需要注意的關鍵點是大量查詢同乙個key。
快取雪崩:理解了快取擊穿就很好理解快取雪崩,雪崩就是大量的或者全部的快取資訊失效。這個比擊穿更可怕。對系統效能影響極大。
快取穿透:快取穿透那些不存在的資料原因導致資料查詢增大。如果是系統偶發對系統影響不是很大,如果是黑客惡意為之就對系統造成很大的影響。
簡單的處理方式就是第一次查詢的空值快取起來,同時設定乙個比較短的過期時間。這個方法看起來還是很不錯的。但是如果是黑客惡意攻擊的話就會存在安全問題,不停的快取無效的key最終記憶體被佔滿,出現記憶體溢位的情況。
還可以用布隆過濾器來實現對查詢快取key進行進行檢查,布隆過濾器返回是否存在。這個可以解決惡意的攻擊。布隆過濾器是實現其實就把我們查詢的key經過多次的hash運算來確定可以是否存在。當乙個不存在的key經過多次hash運算返回存在時也會出現查詢資料庫的情況。但是這種情況會相對比較少。我們也可以通過對hash快取的次數來提高布隆過濾器的效率。使用布隆過濾器還有個問題就是我們需要預先把資料初始化資料。這個過程會影響啟動時間。布隆過濾器演算法比較複雜,博主後續會專門寫篇部落格。
快取擊穿:解決快取擊穿的目的就是為了減少對資料庫的查詢,只讓乙個執行緒或者少量的執行緒去查詢資料庫,其他執行緒等待資料同步到存現之後去快取查詢。對於這種情況我們可以用分布式鎖來實現對查詢執行緒的控制。減少對資料庫的查詢次數。當出現競爭的情況下對同步**塊的寫法還是有講究的。在同步**塊中需要對快取進行一次判斷才能減少資料庫的查詢。下面給大家偽**實現下。
// 這裡只是偽**,並未實現,只是為了更好的理解。
public object querydate
(string key)
try//查詢資料
obj =
querydate
(key)
;//設定快取
cache.
put(key,obj);}
finally
}
快取雪崩:如果對快取失效時間設定一致或者快取機器掛了都可能出現快取雪崩的情況。
針對大量快取同時失效的辦法我們可以在設定快取失效時間再加上個隨機時間,把快取的失效時間分散開,這樣可以防止大面積的快取在同一時間失效。
針對快取伺服器宕機問題我們可以對快取實現高可用,可以減少快取服務宕機的風險。
我們也可以提供多級快取來防止快取雪崩的情況。多級快取機制需要我們業務**進行調整。同事維護2套快取的成本相對也很高。一般的公司用不到。
我們熟悉快取穿透、快取擊穿和快取雪崩的概念的同時還要知道這些問題的解決辦法。我們在設計**的時候要防止查詢快取的介面出現快取穿透、快取擊穿和快取雪崩等問題。當出現這些問題的時候我們也可以及時的去應對。
快取穿透 快取擊穿 快取雪崩
一 快取處理流程 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,那直接返回空結果。二 快取穿透 描述 快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為 1 的資料或id為特別大不存在的資料。這時的使...
快取穿透,快取擊穿,快取雪崩
所謂的快取穿透,簡單來講就是查詢某些不存在的key時,快取和資料庫查詢結果都為空,而空的結果又不被快取起來,而導致每次查詢都去請求資料庫層的情況。在流量大時,可能db就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。過程 快取不命中,進而導致每次查詢都去查詢資料庫,快取也就失去了作...
快取穿透快取擊穿快取雪崩
1 快取穿透 1.1 什麼是快取穿透 快取穿透,是指查詢乙個資料庫一定不存在的資料 核心 快取和資料庫該值不存在 正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。1.2 帶來的...