概念使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢,發現也有沒有,於是本次查詢失敗。當使用者很多時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫很大的壓力,這就相當於出現了快取穿透。
解決方案1.布隆過濾器:布隆過濾器是一種資料結構,對所有可能查詢的引數以hash形式儲存,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力。
2.快取空物件
當儲存層不命中後,即使返回的空物件也將其快取起來,同時設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源
但是這種方法會存在兩個問題
如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵
及時空值設定了過期時間,還是會存在快取層和儲存層資料會有一段時間的視窗不一致,這對於需要保持一致性的業務會影響。(資料庫有資料了,而快取裡還是空物件)
這裡需要注意和快取擊穿的區別,快取擊穿,是指乙個key 非常熱點,在不停的扛著大併發,大併發集中對這一點進行訪問,當這個key在失效的瞬間,持續的大併發就會穿透快取,直接請求資料庫,好像在乙個遮蔽上鑿開乙個洞。
當某個key 在過期的瞬間,有大量的請求併發訪問,這類資料一般是熱點資料,由於快取過期,會同時訪問資料庫來查詢最新資料,並且寫回快取,會導致資料庫瞬間壓力過大。
解決方案設定熱點資料永不過期從快取層面來看,沒有設定過期時間,所以不會出現熱點key過期後產生的問題。
加互斥鎖
分布式鎖:使用分布式鎖,保證對於每個key同時只用乙個執行緒去查詢後端服務,其他執行緒沒有獲取分布式鎖的許可權,因此只需要等待即可。這種方式將高併發的壓力轉移到了分布式鎖,因此對分布式鎖的考驗很大。
在這裡我們不會詳細的區分析解決方案的底層!
redis快取的使用,極大的提公升了應用程式的效能和效率,特別是資料查詢方面。但同時,它也帶來了一些問題。其中,最要害的問題,就是資料的一致性問題,從嚴格意義上講,這個問題無解。如果對資料的一致性要求很高,那麼就不能使用快取。
其實集中過期,倒不是非常致命,比較致命的快取雪崩,是快取伺服器某個節點宕機或斷網。因為自然形成的快取雪崩, - -定是在某個時間段集中建立快取,這個時候,資料庫也是可以頂住壓力的。無非就是對資料庫產生週期性的壓力而已。而快取服務節點的宕機,對資料庫伺服器造成的壓力是不可預知的,很有可能瞬間就把資料庫壓垮。
解決方案redis高可用
這個思想的含義是,既然redis有可能掛掉,那我多增設幾台redis,這樣一台掛掉之後其他的還可以繼續工作 ,其實就是搭建的集群。
2.限流降級
這個解決方案的思想是,在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
3.資料預熱
資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。在即將發生大併發訪問前手動觸發載入快取不同的key ,設定不同的過期時間,讓快取失效的時間點盡量均勻。
Redis 快取穿透 快取擊穿 快取雪崩
快取穿透是指快取和資料庫中都沒有的資料,而使用者不斷發起請求,如發起為id為小於0的資料或id為特別大等不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。舉例 通過分類id查詢廣告集合 param categoryid 廣告分類id return 廣告集合 public listf...
Redis快取穿透 快取擊穿 快取雪崩
4 總結 一般企業都會用到mysql等關係型資料庫,當訪問量不大的時候還可以支撐 當併發量高的時候,比如商品搶購或者主頁訪問瞬間較大的時候,請求直接到達db,可能會導致系統效能急劇下降以致癱瘓。db是面向磁碟的,磁碟io是比較重的操作,效能較低。為了克服上述的問題,通常需要在客戶端和db之間引入一層...
Redis快取穿透 快取擊穿 快取雪崩
指的是,redis快取中和資料庫中都沒有的資料,使用者不斷向伺服器發起請求,導致資料庫壓力過大。一般的流程查詢流程存在redis快取穿透bug 沒獲取到資料,到資料庫中查詢 如果一直沒獲取和查詢到資料,使用者不斷發起請求,資料庫就會不斷地進行查詢操作,導致資料庫壓力增大,導致快取擊穿。解決方案 阻止...