快取穿透其實就是使用者想要查詢乙個資料,發現redis記憶體資料庫中沒有,也就是快取沒有命中,然後就向持久層資料庫查詢,發現也沒有要查詢的資訊,於是就查詢失敗。當使用者很多的額時候,快取都沒有命中,於是都去請求資料庫,這會給資料庫很大的壓力,於是就出現了快取穿透。
解決方案:
1、布隆過濾器
布隆過濾器(bloom filter)是一種資料結構,對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力。
2、快取空物件
當儲存層不命中後,即使返回的空物件也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護後端資料來源。
這兩個方法存在的問題:
如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵。
即使對空值設定了過期時間,還是會存在快取層和儲存層的資料會有一段時間視窗不一致,這對於需要保持一致性的事務會有影響。
快取擊穿是指乙個key非常熱點,在不停的扛著大併發,大併發集中對著乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就會穿破快取,之間請求資料庫,就像多個子彈在乙個屏障上鑿開了乙個洞。
解決方案:
1、設定熱點資料永不過期,從快取層面上看,沒有設定過期時間,所以不會出現熱點key過期後產生的問題。
2、加互斥鎖
分布式鎖:使用分布式鎖,保證對於每個key同時只有乙個執行緒去查詢後端服務,其他執行緒沒有獲得分布式鎖的許可權,因此只需等待即可。這種方式將高併發的壓力轉移到了分布式鎖,所以對分布式鎖的考驗很大。
快取雪崩是指在某乙個時間段,快取集中過期失效,redis宕機。
其中一種是快取過期後,對資料庫的壓力暴增,最後導致雪崩。
集中過期不是非常致命,最致命的是快取伺服器某個節點宕機或斷網。因為自然形成的快取雪崩,一定是在某個時間段集中建立快取,這個時候,資料庫是可以頂住壓力的,但快取服務節點宕機,對資料庫伺服器造成的壓力是不可預知的。
解決方案:
1、redis高可用:
既然redistribution可能會宕機,就多增幾台redis,這樣一台掛掉後其他的還闊以繼續工作,其實就是搭建集群。
2、限流降級:
在快取失效後,通過加鎖或者佇列來控制讀資料寫快取的執行緒數量。比如對某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
3、資料預熱:
在正式部署之前,把有可能訪問的資料預先訪問一遍,這樣部分可能大量訪問的資料就會載入到快取中。在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓快取失效的時間點減量均勻。
redis 快取擊穿和快取穿透
布隆過濾器 快取擊穿 總結有很多使用者,請求介面。為了防止mysql壓力過大,在訪問量很大且資料變動不頻繁的情況下,我們通過增加redis快取減少mysql的壓力。正常的流程為下圖所示。redis中無資料,從mysql中查詢 mysqlserver mysqli connect 127.0.0.1 ...
Redis 快取穿透 快取雪崩和快取擊穿
快取穿透,是指查詢乙個資料庫一定不存在的資料。正常的使用快取流程大致是,資料查詢先進行快取查詢,如果key不存在或者key已經過期,再對資料庫進行查詢,並把查詢到的物件,放進快取。如果資料庫查詢物件為空,則不放進快取。流程 引數傳入物件主鍵id 根據key從快取中獲取物件 如果物件不為空,直接返回 ...
redis快取穿透 快取雪崩和快取擊穿
查詢資料庫中一定不存在的資料,使用者發出查詢請求,根據引數 主鍵id 首先根據key去查詢redis,發現為空,接著查詢資料庫發現沒有結果,然後不會往redis中存入任何資料,接下來所有的請求都會往復進行,都會訪問資料庫,造成資料庫壓力。解決快取穿透,可以在第一次查詢資料庫時,如果返回空,則在red...