redis快取的使用,極大的提公升了應用程式的效能和效率,特別是資料查詢方面。但同時,它也帶來了一 些問題。其中,最要害的問題,就是資料的一致性問題,從嚴格意義上講,這個問題無解。如果對資料的一致性要求很高,那麼就不能使用快取。另外的一些典型問題就是,快取穿透、快取雪崩和快取擊穿。目前,業界也都有比較流行的解決方案。
快取穿透的概念很簡單,使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候出現了快取穿透。
解決方案:
1布隆過濾器: 布隆過濾器是一種資料結構,對所有可能查詢的引數以hash形式儲存,在控制層先進行校驗,不符合則丟棄,從而避免了對底層儲存系統的查詢壓力;
2 快取空物件:當持久層不命中後,即使返回的空物件也將其快取起來,同時會設定乙個過期時間,之後再訪問這個資料將會從快取中獲取,保護了後端資料來源;但是這種方法會存在兩個問題:1 如果空值能夠被快取起來,這就意味著快取需要更多的空間儲存更多的鍵,因為這當中可能會有很多的空值的鍵;2 即使對空值設定了過期時間,還是會存在快取層和持久層的資料會有一段時間視窗的不一致,這對於需要保持一致性的業務會有影響。
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。和快取雪崩不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。快取擊穿是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在一 個屏障上鑿開了乙個洞。
解決方案
1設定熱點資料永不過期 從快取層面來看,沒有設定過期時間,所以不會出現熱點 key 過期後產生的問題。
2加互斥鎖:分布式鎖:使用分布式鎖,保證對於每個key同時只有乙個執行緒去查詢後端服務,其他執行緒沒有獲得分布式鎖的許可權,因此只需要等待即可。這種方式將高併發的壓力轉移到了分布式鎖,因此對分布式鎖的考驗很大。
快取雪崩是指快取同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。
解決方案
1redis高可用 這個思想的含義是,既然redis有可能掛掉,那我多增設幾台redis,這樣一台掛掉之後其他的還可以繼續 工作,其實就是搭建的集群。
2限流降級:這個解決方案的思想是,在快取失效後,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量。比如對 某個key只允許乙個執行緒查詢資料和寫快取,其他執行緒等待。
3資料預熱:資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的數 據就會載入到快取中。在即將發生大併發訪問前手動觸發載入快取不同的key,設定不同的過期時間,讓 快取失效的時間點盡量均勻。
為了解決伺服器啟動後迅速宕機:請求數量較高,主從之間資料吞吐量較大,資料同步操作頻度較高。
解決方案:
前置準備工作
日常例行統計資料訪問記錄,統計訪問頻度較高的熱點資料
利用lru資料刪除策略,構建資料留存佇列例如:storm和kfafa配合:
1. nginx+lua將訪問量上報到kafka中
要統計出來當前最新的實時的熱資料是哪些,我們就得將訪問商品詳情頁的請求 對應的流量,日誌,實時上報到kafka中
2. storm從kafka中消費資料,實時統計出每個商品的訪問次數,訪問次數基於lru記憶體資料結構的儲存方案
3. 每個storm task啟動的時候,基於zk分布式鎖,將自己的id寫入zk的乙個節點中
4. 每個storm task負責完成熱資料的統計,比如每次計數過後,維護乙個前1000個商品的list,每次計算完都更新這個list
5. 寫乙個後台執行緒,每個一段時間,比如一分鐘,將排名前1000的熱資料list,同步到zk中
準備工作
將統計結果中的資料分類,根據級別,redis優先載入級別較高的熱點資料
利用分布式伺服器同時進行資料讀取,提速資料載入過程
熱點資料主從同時預熱
快取預熱就是系統啟動前,提前將相關的快取資料直接載入到快取系統。避免在使用者請求的時候,先查詢資料庫,然後再將資料快取的問題,將熱點資料提前快取,使用者直接查詢事先被預熱的快取資料。 Redis筆記12 快取穿透 快取擊穿 快取雪崩
使用者想要查詢乙個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,於是向持久層資料庫查詢。發現也沒有,於是本次查詢失敗。當使用者很多的時候,快取都沒有命中,於是都去請求了持久層資料庫。這會給持久層資料庫造成很大的壓力,這時候就相當於出現了快取穿透。比如,發起乙個id 1的資料庫查詢請求。布...
Redis 熱鍵問題,快取擊穿,快取穿透,快取雪崩
1.熱鍵問題 描述 熱鍵被大量客戶端訪問,導致大量網路流量集中在一台redis伺服器上,伺服器宕機。解決方法 將熱鍵分散到不同的redis伺服器上 2.快取擊穿 描述 熱鍵被大量客戶端訪問,熱鍵如果過期,可能導致大量網路流量打到 db 伺服器上,導致資料庫伺服器宕機 解決方法 對於熱鍵,訪問之前如果...
Redis三大問題 快取穿透 快取擊穿 快取雪崩
快取擊穿 快取雪崩 前台請求,後台先從快取中取資料,取到直接返回結果,取不到時從資料庫中取,資料庫取到更新快取,並返回結果,資料庫也沒取到,直接返回空結果。快取穿透就是當使用者訪問一條資料時,快取和資料庫中都不存在,就會不斷的發起請求。如果使用者是攻擊者,會導致資料庫壓力過大。解決方案 快取空物件 ...