緩存穿透(Cache Penetration)
什麼是緩存穿透(不存在的數據)
緩存穿透是指用戶查詢的數據,在緩存中沒有,在數據庫中也沒有。從而使數據查詢在緩存中找不到,而不得再也不去數據庫中查找一次,結果返回空(至關於兩次都是無效的查詢),導致大量請求都訪問到數據庫上面。算法
解決方案
- 布隆過濾器(Bloom Filter):相似於哈希表的一種算法,用全部可能的出現的查詢條件生成一個判斷數據是否存在的邏輯,在數據庫查詢前會使用這個判斷邏輯計算出是否存在於數據庫中,若是不存在,則直接過濾掉錯誤信息,從而減輕數據庫層面的壓力。
- 空值緩存:這種方案簡單,只適用於短時間集中訪問的不存在的數據,可是這種數據的緩存時間不要太長,畢竟是無效的數據。這樣能夠應對短期的大量的錯誤訪問,可是不能有效防止攻擊。
緩存擊穿(Cache Breakdown)
什麼是緩存擊穿(高併發訪問同一失效緩存)
緩存穿透是指在高併發系統中,當多用戶同時請求一個數據時,在緩存中失效,在數據庫中有。從而使數據查詢在緩存中過時,而不得再也不去數據庫中查找,且沒有緩存讀寫鎖阻塞時,導致大量請求都訪問到數據庫上面。通常只出如今訪問熱點數據的時候。(秒殺系統應該直接在上游限制流量,放行必定流量後直接斷流並修改緩存,不該屬於緩存擊穿的用例)數據庫
解決方案
- 互斥鎖:當緩存沒找到數據,須要訪問數據庫前,啓動互斥鎖(單例模式雙檢查鎖機制),只容許一個線程訪問數據庫並更新緩存。
- 斷路器模塊:服務熔斷,降級,限流,監控。
- 二級緩存:對一部分熱點數據採用二級緩存的方式,並真對不一樣層級的緩存設置不一樣的失效時間,從而控制請求不能直接擊穿緩存去訪問數據庫。
- 永不過時:只在緩存系統中不設置過時時間,可是須要在應用服務器中存儲對應的過時時間,並控制緩存的更新。
緩存雪崩(Cache Avalanche)
什麼是緩存擊穿(緩存同時大面積失效)
緩存穿透是指當緩存服務器從新啓動或者大量緩存在某一段時間一塊兒失效。從而使數據查詢在緩存中過時,而不得再也不去數據庫中查找,導致大量請求都訪問到數據庫上面。緩存
解決方案
- 互斥鎖:(同上)
- 斷路器模塊:(同上)
- 二級緩存:(同上)
- 永不過時:(同上,只適用於非重啓方案)
- 不一樣的過時時間:針對不一樣的數據,設置不一樣的過時時間。能夠是一個基礎時間(好比1小時)和一個隨機的時間(隨機產生0-600秒)疊加,使不一樣數據的最終過時時間都不同,讓緩存失效的時間點儘可能均勻,屢次自動失效後會更加均勻。(只適用於非重啓方案)
- 序列化緩存:在緩存服務器更新數據後直接序列化數據到硬盤,使重啓後能夠快速恢復緩存數據(只適用於系統重啓)
簡單的緩存問題對比
緩存穿透 | 緩存擊穿 | 緩存雪崩 | |
---|---|---|---|
數據庫是否存在 | 不存在 | 存在 | 存在 |
數據是否相同 | 相同 | 相同 | 不一樣 |
併發數量 | 高併發 | 超高併發 | 高併發 |