1、快取穿透
先來看一下快取穿透,是指業務請求穿過了快取層,落到持久化存盤上,在大多數場景下,我們應用快取是為了承載前端業務請求,快取被擊穿以后,如果請求量比較大,則會導致資料庫出現風險,
以雙十一為例,由于各類促銷活動的疊加,整體網站的訪問量、商品曝光量會是平時的千倍甚至萬倍,巨大的流量暴漲,單靠資料庫是不能承載的,如果快取不能很好的作業,可能會影響資料庫的穩定性,繼而直接影響整體服務,
那么哪些場景下會發生快取穿透呢?
不合理的快取失效策略
快取失效策略如果設定不合理,比如設定了大量快取在同一時間點失效,那么將導致大量快取資料在同一時刻發生快取穿透,業務請求直接打到持久化存盤層,
外部用戶的惡意攻擊
外部惡意用戶利用不存在的 Key,來構造大批量不存在的資料請求我們的服務,由于快取中并不存在這些資料,因此海量請求全部穿過快取,落在資料庫中,將導致資料庫崩潰,
快取穿透如何在業務中避免呢?
-
首先是設定合理的快取失效策略,避免快取資料在同一時間失效,
-
快取穿透還可以通過快取空資料的方式避免,快取空資料非常好理解,就是針對資料庫不存在的資料,在查詢為空時,添加一個對應 null 的值到快取中,這樣在下次請求時,可以通過快取的結果判斷資料庫中是否存在,避免反復的請求資料庫,不過這種方式,需要考慮空資料的 Key 在新增后的處理,
-
快取擊穿也是快取應用常見的問題場景,其是一個非常形象的表達,具體表現:前端請求大量的訪問某個熱點 Key,而這個熱點 Key 在某個時刻恰好失效,導致請求全部落到資料庫上,
-
另外一個方案是使用布隆過濾器,布隆過濾器是應用非常廣泛的一種資料結構,我們熟悉的 Bitmap,可以看作是一種特殊的布隆過濾器,使用布隆過濾器,可在快取前添加一層過濾,布隆過濾器映射到快取,在快取中不存在的資料,會在布隆過濾器這一層攔截,從而保護快取和資料庫的安全,
快取擊穿
在任何一組東西中,最重要的只占其中一小部分,約 20%,其余 80% 盡管是多數,卻是次要的,因此又稱二八定律,
二八定律在快取應用中也不能避免,往往是 20% 的快取資料,承擔了 80% 或者更高的請求,剩下 80% 的快取資料,僅僅承擔了 20% 的訪問流量,
由于二八定律的存在,快取擊穿雖然可能只是一小部分資料失效,但這部分資料如果恰好是熱點資料,還是會對系統造成非常大的危險,
快取擊穿和快取穿透都是降低了整體的快取命中率,不過在表現上比較類似,快取擊穿可以認為是快取穿透的一種特殊場景,所以在解決方案上也可以應用上面提到的那幾種手段,
快取雪崩
其是快取穿透和快取擊穿升級的一種問題場景,
快取雪崩的表現有兩種,一種是大量的快取資料在同一時刻失效,請求全部轉發到資料庫,將導致資料庫壓力過大,服務宕機;另外一種是快取服務不穩定,比如負責快取的 Redis 集群宕機,
在業務開發中,出現快取雪崩非常危險,可能會直接導致大規模服務不可用,因為快取失效時導致的雪崩,一方面是整體的資料存盤鏈路,另一方面是服務呼叫鏈路,最終導致微服務整體的對外服務出現問題,
我們知道,微服務本身就存在雪崩效應,在電商場景中,如果商品服務不可用,最終可能會導致依賴的訂單服務、購物車服務、用戶瀏覽等級聯出現故障,
你考慮一下,如果商品服務出現快取雪崩,繼而商品服務不可用,關聯的周邊服務都會受影響,
那么快取雪崩在業務中如何避免呢?
首先是明確快取集群的容量峰值,通過合理的限流和降級,防止大量請求直接拖垮快取;其次是做好快取集群的高可用,以 Redis 為例,可以通過部署 RedisCluster、Proxy 等不同的快取集群,來實作快取集群高可用,
快取穩定性
首先明確應用快取的目的,大部分快取都是記憶體資料庫,并且可以支持非常高的 QPS,所以快取應用,可以防止海量業務請求擊垮資料庫,保護正常的服務運行,
其次,在考慮快取的穩定性時,要從兩個方面展開,第一個是快取的資料,第二個是快取容器也就是快取服務本身的穩定性,
從快取資料的層面,有一個快取命中率的概念,是指落到快取上的請求占整體請求總量的占比,快取命中率在電商大促等場景中是一個非常關鍵的指標,我們要盡可能地提高快取資料的命中率,一般要求達到 90% 以上,如果是大促等場景,會要求 99% 以上的命中率,
從快取服務的層面,快取集群本身也是一個服務,也會有集群部署,服務可用率,服務的最大容量等,在應用快取時,要對快取服務進行壓測,明確快取的最大水位,如果當前系統容量超過快取閾值,就要通過其他的高可用手段來進行調整,比如服務限流,請求降級,使用訊息佇列等不同的方式,
總結
所以我們在使用快取的時候,要把這幾個場景都考慮到,做到在使用快取的時候,保持穩定狀態,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500674.html
標籤:Java
上一篇:IOS OpenGL ES GPUImage 影像閥值素描,形成有噪點的素描 GPUImageThresholdSketchFilter
下一篇:javaweb:JavaBean
