你管這破玩意叫快取穿透?還是快取擊穿?
來源:哪吒程式設計
大家好,我是哪吒。
上一篇分享了Redis布隆過濾器的原理和應用場景,解決快取穿透,今天分享一下Redis布隆過濾器的原理和應用場景,解決快取穿透,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。
一、快取預熱
Redis快取預熱是指在伺服器啟動或應用程式啟動之前,將一些資料先儲存到Redis中,以提高Redis的效能和資料一致性。這可以減少伺服器在啟動或應用程式啟動時的資料傳輸量和延遲,從而提高應用程式的效能和可靠性。
1、快取預熱常見步驟
(1)資料準備
在應用程式啟動或伺服器啟動之前,準備一些資料,這些資料可以是靜態資料、快取資料或其他需要預熱的資料。
(2)資料儲存
將資料儲存到Redis中,可以使用Redis的列表(List)資料型別或集合(Set)資料型別。
(3)資料預熱
在伺服器啟動或應用程式啟動之前,將資料儲存到Redis中。可以使用Redis的客戶端工具或命令列工具來執行此操作。
(4)資料清洗
在伺服器啟動或應用程式啟動之後,可能會對儲存在Redis中的資料進行清洗和處理。例如,可以刪除過期的資料、修改錯誤的資料等。
需要注意的是,Redis快取預熱可能會增加伺服器的開銷,因此應該在必要時進行。同時,為了減少預熱的次數,可以考慮使用Redis的其他資料型別,如雜湊表(Hash)或有序集合(Sorted Set)。此外,為了提高資料一致性和效能,可以使用Redis的持久化功能,將資料儲存到Redis中,並在伺服器重啟後自動恢復資料。
2、程式碼實現
@Component
@Slf4j
public class BloomFilterInit
{
@Resource
private RedisTemplate redisTemplate;
//初始化白名單資料
@PostConstruct
public void init() {
//1 白名單客戶載入到布隆過濾器
String key = "customer:1";
//2 計算hashValue,由於存在計算出來負數的可能,我們取絕對值
int hashValue = Math.abs(key.hashCode());
//3 透過hashValue和2的32次方後取餘,獲得對應的下標坑位
long index = (long)(hashValue % Math.pow(2,32));
log.info(key+" 對應的坑位index:{}",index);
//4 設定redis裡面的bitmap對應型別白名單:whitelistCustomer的坑位,將該值設定為1
redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);
}
}
二、快取雪崩
Redis快取雪崩是指在快取系統中,由於某些原因,快取的資料突然大量地被刪除或修改,導致快取系統的效能下降,甚至無法正常工作。
1、什麼情況會發生快取雪崩?
(1)誤刪除
由於誤操作或故障,快取系統可能會誤刪除一些正常的資料。這種情況通常會在資料庫中發生。
(2)誤修改
由於誤操作或故障,快取系統可能會誤修改一些正常的資料。這種情況通常會在資料庫中發生。
(3)負載波動
快取系統通常會承受一定的負載波動,例如,在高峰期間,資料量可能會大幅增加,從而導致快取系統的效能下降。
(4)資料變化頻繁
如果快取系統中的資料變化頻繁,例如,每秒鐘都會有大量的資料插入或刪除,那麼快取系統可能會因為響應過慢而導致雪崩。
2、Redis快取叢集實現高可用
(1)主從 + 哨兵
(2)Redis叢集
(3)開啟Redis持久化機制aof/rdb,儘快恢復快取叢集。
3、如何避免Redis快取雪崩?
(1)資料備份
定期備份資料,以防止誤刪除或誤修改。
(2)資料同步
定期同步資料,以防止資料不一致。
(3)負載均衡
使用負載均衡器將請求分配到多個Redis例項上,以減輕單個例項的負載。
(4)資料最佳化
最佳化資料庫結構,減少資料變化頻繁的情況。
(5)監控與告警
監控Redis例項的效能指標,及時發現快取系統的異常,併發出告警。
三、快取穿透
Redis快取穿透是指在Redis快取系統中,由於某些原因,快取的資料無法被正常訪問或處理,導致快取失去了它的作用。
1、什麼情況會發生快取穿透?
(1)資料量過大
當快取中儲存的資料量過大時,快取的資料量可能會超過Redis的資料儲存限制,從而導致快取失去了它的作用。
(2)資料更新頻繁
當快取中儲存的資料更新頻繁時,快取的資料可能會出現非同步的變化,導致快取無法被正常訪問。
(3)資料過期
當快取中儲存的資料過期時,快取的資料可能會失去它的作用,因為Redis會在一定時間後自動將過期的資料刪除。
(4)資料許可權限制
當快取中儲存的資料受到許可權限制時,只有擁有足夠許可權的使用者才能訪問和處理這些資料,從而導致快取失去了它的作用。
(5)Redis效能瓶頸
當Redis伺服器的效能達到極限時,Redis快取可能會因為響應過慢而導致穿透。
2、如何避免Redis快取穿透?
(1)設定合理的快取大小
根據實際需求設定合理的快取大小,以避免快取穿透。
(2)最佳化資料結構
根據實際需求最佳化資料結構,以減少資料的大小和更新頻率。
(3)設定合理的過期時間
設定合理的過期時間,以避免快取失去它的作用。
(4)增加Redis的併發處理能力
透過增加Redis的併發處理能力,以提高快取的處理能力和響應速度。
(5)最佳化Redis伺服器的硬體和軟體配置
透過最佳化Redis伺服器的硬體和軟體配置,以提高Redis的效能和處理能力。
四、透過空物件快取解決快取穿透
如果發生了快取穿透,可以針對要查詢的資料,在Redis中插入一條資料,新增一個約定好的預設值,比如defaultNull。
比如你想透過某個id查詢某某訂單,Redis中沒有,MySQL中也沒有,此時,就可以在Redis中插入一條,存為defaultNull,下次再查詢就有了,因為是提前約定好的,前端也明白是啥意思,一切OK,歲月靜好。
這種方式只能解決key相同的情況,如果key都不同,則完蛋。
五、Google布隆過濾器Guava解決快取穿透
1、引入pom
<!--guava Google 開源的 Guava 中自帶的布隆過濾器-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
2、建立布隆過濾器
BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);
(3)布隆過濾器中新增元素
bloomFilter.mightContain(1)
(4)判斷布隆過濾器中是否存在
bloomFilter.mightContain(1)
3、fpp誤判率
@Service
@Slf4j
public class GuavaBloomFilterService {
public static final int SIZE = 1000000;
//誤判率
public static double fpp = 0.01;
//建立guava布隆過濾器
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);
public void guavaBloomFilter() {
for (int i = 1; i <= SIZE; i++) {
bloomFilter.put(i);
}
ArrayList<Integer> list = new ArrayList<>(10000);
for (int i = SIZE + 1; i <= SIZE + (10000); i++) {
if (bloomFilter.mightContain(i)) {
log.info("被誤判了:{}", i);
list.add(i);
}
}
log.info("誤判總數量:{}", list.size());
}
}
六、Redis快取擊穿
Redis快取擊穿是指在Redis快取系統中,由於某些原因,快取的資料無法被正常訪問或處理,導致快取失去了它的作用。
1、什麼情況會發生快取擊穿?
根本原因:熱點Key失效。
(1)資料量過大
當快取中儲存的資料量過大時,快取的資料量可能會超過Redis的資料儲存限制,從而導致快取失去了它的作用。
(2)資料更新頻繁
當快取中儲存的資料更新頻繁時,快取的資料可能會出現非同步的變化,導致快取無法被正常訪問。
(3)資料過期
當快取中儲存的資料過期時,快取的資料可能會失去它的作用,因為Redis會在一定時間後自動將過期的資料刪除。
(4)資料許可權限制
當快取中儲存的資料受到許可權限制時,只有擁有足夠許可權的使用者才能訪問和處理這些資料,從而導致快取失去了它的作用。
(5)Redis效能瓶頸
當Redis伺服器的效能達到極限時,Redis快取可能會因為響應過慢而導致擊穿。
2、如何避免Redis快取擊穿?
(1)設定合理的快取大小
根據實際需求設定合理的快取大小,以避免快取穿透。
(2)最佳化資料結構
根據實際需求最佳化資料結構,以減少資料的大小和更新頻率。
(3)設定合理的過期時間
設定合理的過期時間,以避免快取失去它的作用。
(4)增加Redis的併發處理能力
透過增加Redis的併發處理能力,以提高快取的處理能力和響應速度。
(5)最佳化Redis伺服器的硬體和軟體配置
透過最佳化Redis伺服器的硬體和軟體配置,以提高Redis的效能和處理能力。
七、Redis快取擊穿解決方案
1、互斥更新
透過雙檢加鎖機制。
2、差異失效時間
先更新從快取B,再更新主快取A,而且讓從快取B的快取失效時間長於A,保證A失效時,B還在。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2952087/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 快取穿透、快取擊穿、快取雪崩快取穿透
- 快取穿透、快取雪崩、快取擊穿快取穿透
- 快取穿透、快取雪崩和快取擊穿是什麼?快取穿透
- 什麼是redis快取雪崩、快取穿透、快取擊穿Redis快取穿透
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- 快取穿透、快取擊穿、快取雪崩區別快取穿透
- 快取穿透、快取擊穿、快取雪崩、快取預熱快取穿透
- 面試官:快取穿透、快取雪崩和快取擊穿是什麼?面試快取穿透
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- 面試總結 —— Redis “快取穿透”、“快取擊穿”、“快取雪崩”面試Redis快取穿透
- 快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- Redis——快取穿透、快取擊穿、快取雪崩、分散式鎖Redis快取穿透分散式
- 快取穿透、快取擊穿、快取雪崩概念及解決方案快取穿透
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- Redis的快取穿透、快取雪崩、快取擊穿的區別Redis快取穿透
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- 快取穿透、快取擊穿、快取雪崩區別和解決方案快取穿透
- Redis快取穿透,擊穿和雪崩Redis快取穿透
- Redis 快取擊穿(失效)、快取穿透、快取雪崩怎麼解決?Redis快取穿透
- 十分鐘徹底掌握快取擊穿、快取穿透、快取雪崩快取穿透
- Redis 快取雪崩,快取擊穿和快取穿透技術方案總結Redis快取穿透
- Redis 面試常見問題———快取雪崩、快取擊穿以及快取穿透Redis面試快取穿透
- 快取穿透、快取擊穿、快取雪崩的場景以及解決方法快取穿透
- Redis快取雪崩、快取穿透、快取擊穿對比看這一篇就夠了Redis快取穿透
- Redis系列:快取擊穿.穿透.雪崩(九)Redis快取穿透
- 如何設計快取系統:快取穿透,快取擊穿,快取雪崩解決方案分析快取穿透
- 擊穿快取快取
- 快取淘汰、快取穿透、快取擊穿、快取雪崩、資料庫快取雙寫一致性快取穿透資料庫
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- 一文讀懂快取穿透、快取擊穿、快取雪崩及其解決方案快取穿透
- 圖解 | 你管這破玩意叫哨兵?圖解
- 怎麼學Redis 快取穿透、擊穿、雪崩Redis快取穿透
- 來說說快取穿透、快取擊穿、快取雪崩都是什麼?怎麼解決?快取穿透
- Redis快取穿透/快取雪崩/快取擊穿(案例:產生的原因 解決方案利/弊)Redis快取穿透
- 一文徹底弄懂並解決Redis的快取雪崩,快取擊穿,快取穿透Redis快取穿透
- 原來快取也會雪崩、擊穿、穿透啊!快取穿透
- 【Redis場景3】快取穿透、擊穿問題Redis快取穿透