Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透
Redis 的緩存異常處理 —— 緩存雪崩、緩存擊穿、緩存穿透
在實際應用 Redis 過程中,如果將 Redis 作為數據庫的緩存,經常會遇到這幾個問題:緩存雪崩、緩存擊穿、緩存穿透等。
緩存雪崩
緩存雪崩指的是,大量的應用無法在 Redis 緩存中處理,然后大量請求發送到了數據庫,導致數據庫的壓力激增,甚至可能導致數據庫崩潰,從而導致整個系統崩潰,引發雪崩一樣的連鎖效應。
而引起緩存雪崩的原因,一般如下:
1、緩存中大量 key 同時過期
2、Redis 實例掛掉了,無法處理請求
對于原因 1,在實際應用中應當避免大量 key 同時過期的場景。如果確實有這種業務場景,可以微調這批 key 過期的時間,使其能有一定的相差間隔。
對于原因2,之前提到的Redis 主從集群其實可以比較好地實現主 Redis 實例掛掉后,能有其他從庫快速切換為主庫,繼續提供服務。
當然,以上都是預防的措施,如果已經發生了 緩存雪崩,為了防止數據庫被大量的請求搞崩潰,可以采用 服務熔斷 或者 請求限流。
服務熔斷就是暫停對業務提供 Redis 服務,直到 Redis 恢復正常,再向外提供服務。 當然,這種情況下,業務也會整個停擺了。 另外一種比較溫和的辦法就是請求限流。請求限流顧名思義,就是限制請求的流量,隨機丟棄一部分的請求,以保證不會同時有太多請求壓入數據庫。
緩存擊穿
緩存擊穿是指,針對某個熱點數據,突然在緩存中失效,然后這些請求到熱點數據的請求會都請求到數據庫。
緩存擊穿一般是熱點 key 在 Redis 中過期了導致的。 最直接的方法就是,對于熱點 key ,就不設置過期時間。
緩存穿透
緩存穿透指的是,數據既不在 Redis 中,也不在數據庫中。每次請求 Redis 發現沒有對應的 key之后,再去請求數據庫,發現數據庫也沒有。 那么這時, Redis 就相當于一個擺設,沒有具體的作用了。如果有人惡意攻擊系統,故意使用空值或者其他不存在的值進行頻繁請求,那么也會對數據庫造成比較大的壓力。
為了避免緩存穿透,我們可以:
1、緩存空值或缺省值
2、采用布隆過濾器,提前判斷是否有此數據。
布隆過濾器實際上就是把 key 通過三次不同的哈希,計算出三個哈希值,然后在哈希表中把對應哈希值位置置為1。當有新的請求過來時,先判斷這個 key 經過N次哈希后,對應的哈希值位置是否為1,只要有一個不為1,就說明此 key 之前沒有緩存過。
實際上,布隆過濾器也是有缺陷的,它不能完全保證請求過來的 key ,通過布隆過濾器的校驗,就一定有這個數據。 但是,只要沒有通過布隆過濾器的校驗,那么這個 key 就一定不存在。 其實這樣就已經可以過濾掉大部分不存在的 key 請求了。
正如以上提到的布隆過濾器缺陷,如果布隆過濾器的哈希槽過短,很有可能導致大部分的位置都為 1 ,那么此時,布隆過濾器就失去了它的意義。 所以,當我們發現布隆過濾器大部分位置都為1了,應該要擴寬哈希槽。
3、在實際業務中,我們對于請求的參數應該要先進行校驗,請求的參數應該要在規定范圍內。實際上,在工程應用中,主要也是依賴于參數的校驗,過濾掉很多無效請求。
數據不一致性
當使用 Redis 作為數據庫緩存時,可能會存在數據不一致的問題。
當需要修改一份數據時,需要同時修改數據庫和緩存,那么這里就要區分:先修改數據庫還是修改緩存;對于緩存,是直接修改數據還是刪除數據?
Remi醬不易,多多點贊支持哦!
文章來源:https://www.jianshu.com/p/2d45d6cd235d
總結
以上是生活随笔為你收集整理的Redis 的缓存异常处理 —— 缓存雪崩、缓存击穿、缓存穿透的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot的全局异常处理的优雅
- 下一篇: 如何理解 JAVA 中的 volatil