日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

發布時間:2024/2/2 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 缓存穿透、缓存击穿、缓存雪崩区别和解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文由 簡悅 SimpRead 轉碼, 原文地址 zhuanlan.zhihu.com

前言

Redis 作為目前使用最廣泛的緩存,相信大家都不陌生。但是使用緩存并沒有這么簡單,還要考慮緩存雪崩,緩存擊穿,緩存穿透的問題,什么是緩存雪崩,擊穿,穿透呢,出現這些問題又怎么解決呢,接下來學習一下吧。

緩存雪崩

什么是緩存雪崩?

當某一個時刻出現大規模的緩存失效的情況,那么就會導致大量的請求直接打在數據庫上面,導致數據庫壓力巨大,如果在高并發的情況下,可能瞬間就會導致數據庫宕機。這時候如果運維馬上又重啟數據庫,馬上又會有新的流量把數據庫打死。這就是緩存雪崩。

分析:

造成緩存雪崩的關鍵在于在同一時間大規模的 key 失效。為什么會出現這個問題呢,有幾種可能,第一種可能是 Redis 宕機,第二種可能是采用了相同的過期時間。搞清楚原因之后,那么有什么解決方案呢?

解決方案:

1、在原有的失效時間上加上一個隨機值,比如 1-5 分鐘隨機。這樣就避免了因為采用相同的過期時間導致的緩存雪崩。

如果真的發生了緩存雪崩,有沒有什么兜底的措施?

2、使用熔斷機制。當流量到達一定的閾值時,就直接返回 “系統擁擠” 之類的提示,防止過多的請求打在數據庫上。至少能保證一部分用戶是可以正常使用,其他用戶多刷新幾次也能得到結果。

3、提高數據庫的容災能力,可以使用分庫分表,讀寫分離的策略。

4、為了防止 Redis 宕機導致緩存雪崩的問題,可以搭建 Redis 集群,提高 Redis 的容災性。

緩存擊穿

什么是緩存擊穿?

其實跟緩存雪崩有點類似,緩存雪崩是大規模的 key 失效,而緩存擊穿是一個熱點的 Key,有大并發集中對其進行訪問,突然間這個 Key 失效了,導致大并發全部打在數據庫上,導致數據庫壓力劇增。這種現象就叫做緩存擊穿。

分析:

關鍵在于某個熱點的 key 失效了,導致大并發集中打在數據庫上。所以要從兩個方面解決,第一是否可以考慮熱點 key 不設置過期時間,第二是否可以考慮降低打在數據庫上的請求數量。

解決方案:

1、上面說過了,如果業務允許的話,對于熱點的 key 可以設置永不過期的 key。

2、使用互斥鎖。如果緩存失效的情況,只有拿到鎖才可以查詢數據庫,降低了在同一時刻打在數據庫上的請求,防止數據庫打死。當然這樣會導致系統的性能變差。

緩存穿透

什么是緩存穿透?

我們使用 Redis 大部分情況都是通過 Key 查詢對應的值,假如發送的請求傳進來的 key 是不存在 Redis 中的,那么就查不到緩存,查不到緩存就會去數據庫查詢。假如有大量這樣的請求,這些請求像 “穿透” 了緩存一樣直接打在數據庫上,這種現象就叫做緩存穿透。

分析:

關鍵在于在 Redis 查不到 key 值,這和緩存擊穿有根本的區別,區別在于緩存穿透的情況是傳進來的 key 在 Redis 中是不存在的。假如有黑客傳進大量的不存在的 key,那么大量的請求打在數據庫上是很致命的問題,所以在日常開發中要對參數做好校驗,一些非法的參數,不可能存在的 key 就直接返回錯誤提示,要對調用方保持這種 “不信任” 的心態。

解決方案:

1、把無效的 Key 存進 Redis 中。如果 Redis 查不到數據,數據庫也查不到,我們把這個 Key 值保存進 Redis,設置 value="null",當下次再通過這個 Key 查詢時就不需要再查詢數據庫。這種處理方式肯定是有問題的,假如傳進來的這個不存在的 Key 值每次都是隨機的,那存進 Redis 也沒有意義。

2、使用布隆過濾器。布隆過濾器的作用是某個 key 不存在,那么就一定不存在,它說某個 key 存在,那么很大可能是存在 (存在一定的誤判率)。于是我們可以在緩存之前再加一層布隆過濾器,在查詢的時候先去布隆過濾器查詢 key 是否存在,如果不存在就直接返回。

總結

這三個問題在使用 Redis 的時候是肯定會遇到的,而且是非常致命性的問題,所以在日常開發中一定要注意,每次使用 Redis 時,都要對其保持嚴謹的態度。還有一個需要注意的是要做好熔斷,一旦出現緩存雪崩,擊穿,穿透這種情況,至少還有熔斷機制保護數據庫不會被打死。

總結

以上是生活随笔為你收集整理的缓存穿透、缓存击穿、缓存雪崩区别和解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。