1. 程式人生 > >面試官:快取穿透、快取雪崩和快取擊穿是什麼?

面試官:快取穿透、快取雪崩和快取擊穿是什麼?

## 前言 >原創公眾號:bigsai 對於快取穿透、快取雪崩和快取擊穿常常出現在面試中,今天來看看它到底是啥吧? ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/img_convert/aa340ba8f9046b6a1e9a81783bde12a7.png) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/img_convert/94a74d77a973f0c8bccc9163cfe46d70.png) ## redis快取穿透 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/img_convert/316f5e52d665d8b003c7c47b868db990.png) **理解** - 重在`穿透`吧,也就是訪問透過redis直接經過mysql,通常是一個不存在的`key`,在資料庫查詢為`null`。每次請求落在資料庫、並且高併發。資料庫扛不住會掛掉。 **解決方案** - 可以將查到的null設成該key的快取物件。 - 當然,也可以根據明顯錯誤的key在邏輯層就就行`驗證`。 - 同時,你也可以分析使用者行為,是否為故意請求或者爬蟲、攻擊者。針對使用者訪問做限制。 - 其他等等,比如用布隆過濾器(超大型hashmap)先過濾。 ## redis快取雪崩 **理解** - 雪崩,就是某`東西蜂擁而至`的意思,像雪崩一樣。在這裡,就是redis快取集體`大規模集體失效`,在高併發情況下突然使得key大規模訪問mysql,使得資料庫崩掉。可以想象下國家`人口老年化`。以後那天人集中在70-80歲,就沒人幹活了。國家勞動力就造成壓力。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/img_convert/d562024d4aa891d44038c7077bbb960f.png) **解決方案** - 通常的解決方案是將key的過期時間後面加上一個`隨機數`,讓key均勻的失效。 - 考慮用佇列或者鎖讓程式執行在壓力範圍之內,當然這種方案可能會影響併發量。 - 熱點資料可以考慮不失效 ## redis快取擊穿 **理解** 快取擊穿,是指一個key非常熱點,在不停的扛著大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,好像蠻力擊穿一樣。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/img_convert/4b1dea4d6fd4c2f7baa344bc5def8e7b.png) - 擊穿和穿透不同,穿透的意思是想法`繞過`redis去使得資料庫崩掉。而擊穿你可以理解為`正面剛`擊穿,這種通常為大量併發對一個key進行大規模的讀寫操作。這個key在快取失效期間大量請求資料庫,對資料庫造成太大壓力使得資料庫崩掉。就`比如`在秒殺場景下10000塊錢的mac和100塊的mac這個100塊的那個訂單肯定會被搶到爆,不斷的請求(當然具體秒殺有自己處理方式這裡只是舉個例子)。所以快取擊穿就是針對某個常用key大量請求導致資料庫崩潰。 **解決方案** - 可以使用互斥鎖避免大量請求同時落到db。 - 布隆過濾器,判斷某個容器是否在集合中 - 可以將快取設定永不過期(適合部分情況) - 做好熔斷、降級,防止系統崩潰。 >原創公眾號