一、說明
????????Redis 緩存的使用,極大的提升了應用程序的性能和效率,特別是數(shù)據(jù)查詢方面。但同時,它也帶來了一些問題。其中,最要害的問題,就是數(shù)據(jù)的一致性問題,從嚴格意義上講,這個問題無解。如果對數(shù)據(jù)的一致性要求很高,那么就不能使用緩存。
二、緩存穿透
2.1 概念
????????緩存穿透的概念很簡單,用戶想要查詢一個數(shù)據(jù),發(fā)現(xiàn) redis 內(nèi)存數(shù)據(jù)庫沒有,也就是緩存沒有命中,于是向持久層數(shù)據(jù)庫查詢。發(fā)現(xiàn)也沒有,于是本次查詢失敗。當用戶很多的時候,緩存都沒有命中,于是都去請求了持久層數(shù)據(jù)庫。這會給持久層數(shù)據(jù)庫造成很大的壓力,這時候就相當于出現(xiàn)了緩存穿透。
2.2 解決方案
2.2.1 布隆過濾器
????????布隆過濾器是一種數(shù)據(jù)結構,對所有可能查詢的參數(shù)以 hash 形式存儲,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存儲系統(tǒng)的查詢壓力。
2.2.2 緩存空對象
????????當存儲層不命中后,即使返回的空對象也將其緩存起來,同時會設置一個過期時間,之后再訪問這個數(shù)據(jù)將會從緩存中獲取,保護了后端數(shù)據(jù)源。
2.2.3 可能存在的問題
? ? ? ? 1、如果空值能夠被緩存起來,這就意味著緩存需要更多的空間存儲更多的鍵,因為這當中可能會有很多的空值的鍵。
? ? ? ? 2、即使對空值設置了過期時間,還是會存在緩存層和存儲層的數(shù)據(jù)會有一段時間窗口的不一致,這對于需要保持一致性的業(yè)務會有影響。?
三、緩存擊穿
3.1 概念
????????緩存擊穿,是指一個 key 非常熱點,在不停的扛著大并發(fā),大并發(fā)集中對這一個點進行訪問,當這個 key 在失效的瞬間,持續(xù)的大并發(fā)就穿破緩存,直接請求數(shù)據(jù)庫,就像在一個屏障上鑿開了一個洞。
????????當某個 key 在過期的瞬間,有大量的請求并發(fā)訪問,這類數(shù)據(jù)一般是熱點數(shù)據(jù),由于緩存過期,會同時訪問數(shù)據(jù)庫來查詢最新數(shù)據(jù),并且回寫緩存,會導使數(shù)據(jù)庫瞬間壓力過大。
3.2 解決方案
3.2.1 設置熱點數(shù)據(jù)永不過期
????????從緩存層面來看,沒有設置過期時間,所以不會出現(xiàn)熱點 key 過期后產(chǎn)生的問題
3.2.2 加互斥鎖
????????分布式鎖:使用分布式鎖,保證對于每個 key 同時只有一個線程去查詢后端服務,其他線程沒有獲得分布式鎖的權限,因此只需要等待即可。這種方式將高并發(fā)的壓力轉(zhuǎn)移到了分布式鎖,因此對分布式鎖的考驗很大。
四、緩存雪崩
4.1 概念
????????緩存雪崩,是指在某一個時間段,緩存集中過期失效。
????????產(chǎn)生雪崩的原因之一,比如在寫本文的時候,馬上就要到雙十二零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了緩存,假設緩存一個小時。那么到了凌晨一點鐘的時候,這批商品的緩存就都過期了。而對這批商品的訪問查詢,都落到了數(shù)據(jù)庫上,對于數(shù)據(jù)庫而言,就會產(chǎn)生周期性的壓力波峰。于是所有的請求都會達到存儲層,存儲層的調(diào)用量會暴增,造成存儲層也會掛掉的情況。
????????其實集中過期,倒不是非常致命,比較致命的緩存雪崩,是緩存服務器某個節(jié)點宕機或斷網(wǎng)。因為自然形成的緩存雪崩,一定是在某個時間段集中創(chuàng)建緩存,這個時候,數(shù)據(jù)庫也是可以頂住壓力的。無非就是對數(shù)據(jù)庫產(chǎn)生周期性的壓力而已。而緩存服務節(jié)點的宕機,對數(shù)據(jù)庫服務器造成的壓力是不可預知的,很有可能瞬間就把數(shù)據(jù)庫壓垮。?
4.2 解決方案
4.2.1 redis 高可用
????????這個思想的含義是,既然 redis 有可能掛掉,那我多增設幾臺 redis,這樣一臺掛掉之后其他的還可以繼續(xù)工作,其實就是搭建的集群。
4.2.2 限流降級
????????這個解決方案的思想是,在緩存失效后,通過加鎖或者隊列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。比如對某個 key 只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待。文章來源:http://www.zghlxwxcb.cn/news/detail-692373.html
4.2.3 數(shù)據(jù)預熱
????????數(shù)據(jù)加熱的含義就是在正式部署之前,我先把可能的數(shù)據(jù)先預先訪問一遍,這樣部分可能大量訪問的數(shù)據(jù)就會加載到緩存中。在即將發(fā)生大并發(fā)訪問前手動觸發(fā)加載緩存不同的 key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。文章來源地址http://www.zghlxwxcb.cn/news/detail-692373.html
到了這里,關于Redis 緩存穿透擊穿和雪崩的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!