Redis快取穿透
相關視頻教程(來自動力節點):https://www.bilibili.com/video/BV1Uz4y1X72A
相關資料下載:http://www.bjpowernode.com/?cnblogs
一、快取穿透
1. 概念
快取穿透的概念很簡單,用戶想要查詢一個資料,發現redis記憶體資料庫沒有,也就是快取沒有命中,于是向持久層資料庫查詢,發現也沒有,于是本次查詢失敗,當用戶很多的時候,快取都沒有命中,于是都去請求了持久層資料庫,這會給持久層資料庫造成很大的壓力,這時候就相當于出現了快取穿透,
這里需要注意和快取擊穿的區別,快取擊穿,是指一個key非常熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大并發就穿破快取,直接請求資料庫,就像在一個屏障上鑿開了一個洞,
2. 解決方案
1)布隆過濾器
布隆過濾器是一種資料結構,垃圾網站和正常網站加起來全世界據統計也有幾十億個,網警要過濾這些垃圾網站,總不能到資料庫里面一個一個去比較吧,這就可以使用布隆過濾器,假設我們存盤一億個垃圾網站地址,
有一天網警查到了一個可疑的網站,想判斷一下是否是XX網站,首先將可疑網站通過哈希映射到1億個位元陣列上的8個點,如果8個點的其中有一個點不為1,則可以判斷該元素一定不存在集合中,
那這個布隆過濾器是如何解決redis中的快取穿透呢?很簡單首先也是對所有可能查詢的引數以hash形式存盤,當用戶想要查詢的時候,使用布隆過濾器發現不在集合中,就直接丟棄,不再對持久層查詢,

這個形式很簡單,
2)快取空物件
當存盤層不命中后,即使回傳的空物件也將其快取起來,同時會設定一個過期時間,之后再訪問這個資料將會從快取中獲取,保護了后端資料源;

但是這種方法會存在兩個問題:
- 如果空值能夠被快取起來,這就意味著快取需要更多的空間存盤更多的鍵,因為這當中可能會有很多的空值的鍵;
- 即使對空值設定了過期時間,還是會存在快取層和存盤層的資料會有一段時間視窗的不一致,這對于需要保持一致性的業務會有影響,
二、快取雪崩
1、概念
快取雪崩是指,快取層出現了錯誤,不能正常作業了,于是所有的請求都會達到存盤層,存盤層的呼叫量會暴增,造成存盤層也會掛掉的情況,
2、解決方案
(1)redis高可用
這個思想的含義是,既然redis有可能掛掉,那我多增設幾臺redis,這樣一臺掛掉之后其他的還可以繼續作業,其實就是搭建的集群,
(2)限流降級
這個解決方案的思想是,在快取失效后,通過加鎖或者佇列來控制讀資料庫寫快取的執行緒數量,比如對某個key只允許一個執行緒查詢資料和寫快取,其他執行緒等待,
(3)資料預熱
資料加熱的含義就是在正式部署之前,我先把可能的資料先預先訪問一遍,這樣部分可能大量訪問的資料就會加載到快取中,在即將發生大并發訪問前手動觸發加載快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388909.html
標籤:Java
