自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你管這破玩意叫緩存穿透?還是緩存擊穿?

數(shù)據(jù)庫 Redis
Redis緩存預(yù)熱是指在服務(wù)器啟動或應(yīng)用程序啟動之前,將一些數(shù)據(jù)先存儲到Redis中,以提高Redis的性能和數(shù)據(jù)一致性。這可以減少服務(wù)器在啟動或應(yīng)用程序啟動時的數(shù)據(jù)傳輸量和延遲,從而提高應(yīng)用程序的性能和可靠性。

大家好,我是哪吒。

今天分享一下Redis布隆過濾器的原理和應(yīng)用場景,解決緩存穿透,實現(xiàn)快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。

一、緩存預(yù)熱

Redis緩存預(yù)熱是指在服務(wù)器啟動或應(yīng)用程序啟動之前,將一些數(shù)據(jù)先存儲到Redis中,以提高Redis的性能和數(shù)據(jù)一致性。這可以減少服務(wù)器在啟動或應(yīng)用程序啟動時的數(shù)據(jù)傳輸量和延遲,從而提高應(yīng)用程序的性能和可靠性。

1、緩存預(yù)熱常見步驟

(1)數(shù)據(jù)準(zhǔn)備

在應(yīng)用程序啟動或服務(wù)器啟動之前,準(zhǔn)備一些數(shù)據(jù),這些數(shù)據(jù)可以是靜態(tài)數(shù)據(jù)、緩存數(shù)據(jù)或其他需要預(yù)熱的數(shù)據(jù)。

(2)數(shù)據(jù)存儲

將數(shù)據(jù)存儲到Redis中,可以使用Redis的列表(List)數(shù)據(jù)類型或集合(Set)數(shù)據(jù)類型。

(3)數(shù)據(jù)預(yù)熱

在服務(wù)器啟動或應(yīng)用程序啟動之前,將數(shù)據(jù)存儲到Redis中??梢允褂肦edis的客戶端工具或命令行工具來執(zhí)行此操作。

(4)數(shù)據(jù)清洗

在服務(wù)器啟動或應(yīng)用程序啟動之后,可能會對存儲在Redis中的數(shù)據(jù)進行清洗和處理。例如,可以刪除過期的數(shù)據(jù)、修改錯誤的數(shù)據(jù)等。

需要注意的是,Redis緩存預(yù)熱可能會增加服務(wù)器的開銷,因此應(yīng)該在必要時進行。同時,為了減少預(yù)熱的次數(shù),可以考慮使用Redis的其他數(shù)據(jù)類型,如哈希表(Hash)或有序集合(Sorted Set)。此外,為了提高數(shù)據(jù)一致性和性能,可以使用Redis的持久化功能,將數(shù)據(jù)存儲到Redis中,并在服務(wù)器重啟后自動恢復(fù)數(shù)據(jù)。

2、代碼實現(xiàn)

@Component
@Slf4j
public class BloomFilterInit
{
    @Resource
    private RedisTemplate redisTemplate;

    //初始化白名單數(shù)據(jù)
    @PostConstruct
    public void init() {
        //1 白名單客戶加載到布隆過濾器
        String key = "customer:1";
        //2 計算hashValue,由于存在計算出來負(fù)數(shù)的可能,我們?nèi)〗^對值
        int hashValue = Math.abs(key.hashCode());
        //3 通過hashValue和2的32次方后取余,獲得對應(yīng)的下標(biāo)坑位
        long index = (long)(hashValue % Math.pow(2,32));
        log.info(key+" 對應(yīng)的坑位index:{}",index);
        //4 設(shè)置redis里面的bitmap對應(yīng)類型白名單:whitelistCustomer的坑位,將該值設(shè)置為1
        redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);

    }
}

二、緩存雪崩

Redis緩存雪崩是指在緩存系統(tǒng)中,由于某些原因,緩存的數(shù)據(jù)突然大量地被刪除或修改,導(dǎo)致緩存系統(tǒng)的性能下降,甚至無法正常工作。

1、什么情況會發(fā)生緩存雪崩?

(1)誤刪除

由于誤操作或故障,緩存系統(tǒng)可能會誤刪除一些正常的數(shù)據(jù)。這種情況通常會在數(shù)據(jù)庫中發(fā)生。

(2)誤修改

由于誤操作或故障,緩存系統(tǒng)可能會誤修改一些正常的數(shù)據(jù)。這種情況通常會在數(shù)據(jù)庫中發(fā)生。

(3)負(fù)載波動

緩存系統(tǒng)通常會承受一定的負(fù)載波動,例如,在高峰期間,數(shù)據(jù)量可能會大幅增加,從而導(dǎo)致緩存系統(tǒng)的性能下降。

(4)數(shù)據(jù)變化頻繁

如果緩存系統(tǒng)中的數(shù)據(jù)變化頻繁,例如,每秒鐘都會有大量的數(shù)據(jù)插入或刪除,那么緩存系統(tǒng)可能會因為響應(yīng)過慢而導(dǎo)致雪崩。

2、Redis緩存集群實現(xiàn)高可用

  • 主從 + 哨兵
  • Redis集群
  • 開啟Redis持久化機制aof/rdb,盡快恢復(fù)緩存集群。

3、如何避免Redis緩存雪崩?

(1)數(shù)據(jù)備份

定期備份數(shù)據(jù),以防止誤刪除或誤修改。

(2)數(shù)據(jù)同步

定期同步數(shù)據(jù),以防止數(shù)據(jù)不一致。

(3)負(fù)載均衡

使用負(fù)載均衡器將請求分配到多個Redis實例上,以減輕單個實例的負(fù)載。

(4)數(shù)據(jù)優(yōu)化

優(yōu)化數(shù)據(jù)庫結(jié)構(gòu),減少數(shù)據(jù)變化頻繁的情況。

(5)監(jiān)控與告警

監(jiān)控Redis實例的性能指標(biāo),及時發(fā)現(xiàn)緩存系統(tǒng)的異常,并發(fā)出告警。

三、緩存穿透

Redis緩存穿透是指在Redis緩存系統(tǒng)中,由于某些原因,緩存的數(shù)據(jù)無法被正常訪問或處理,導(dǎo)致緩存失去了它的作用。

1、什么情況會發(fā)生緩存穿透?

(1)數(shù)據(jù)量過大

當(dāng)緩存中存儲的數(shù)據(jù)量過大時,緩存的數(shù)據(jù)量可能會超過Redis的數(shù)據(jù)存儲限制,從而導(dǎo)致緩存失去了它的作用。

(2)數(shù)據(jù)更新頻繁

當(dāng)緩存中存儲的數(shù)據(jù)更新頻繁時,緩存的數(shù)據(jù)可能會出現(xiàn)異步的變化,導(dǎo)致緩存無法被正常訪問。

(3)數(shù)據(jù)過期

當(dāng)緩存中存儲的數(shù)據(jù)過期時,緩存的數(shù)據(jù)可能會失去它的作用,因為Redis會在一定時間后自動將過期的數(shù)據(jù)刪除。

(4)數(shù)據(jù)權(quán)限限制

當(dāng)緩存中存儲的數(shù)據(jù)受到權(quán)限限制時,只有擁有足夠權(quán)限的用戶才能訪問和處理這些數(shù)據(jù),從而導(dǎo)致緩存失去了它的作用。

(5)Redis性能瓶頸

當(dāng)Redis服務(wù)器的性能達到極限時,Redis緩存可能會因為響應(yīng)過慢而導(dǎo)致穿透。

2、如何避免Redis緩存穿透?

(1)設(shè)置合理的緩存大小

根據(jù)實際需求設(shè)置合理的緩存大小,以避免緩存穿透。

(2)優(yōu)化數(shù)據(jù)結(jié)構(gòu)

根據(jù)實際需求優(yōu)化數(shù)據(jù)結(jié)構(gòu),以減少數(shù)據(jù)的大小和更新頻率。

(3)設(shè)置合理的過期時間

設(shè)置合理的過期時間,以避免緩存失去它的作用。

(4)增加Redis的并發(fā)處理能力

通過增加Redis的并發(fā)處理能力,以提高緩存的處理能力和響應(yīng)速度。

(5)優(yōu)化Redis服務(wù)器的硬件和軟件配置

通過優(yōu)化Redis服務(wù)器的硬件和軟件配置,以提高Redis的性能和處理能力。

圖片

Redis緩存穿透

四、通過空對象緩存解決緩存穿透

如果發(fā)生了緩存穿透,可以針對要查詢的數(shù)據(jù),在Redis中插入一條數(shù)據(jù),添加一個約定好的默認(rèn)值,比如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、創(chuàng)建布隆過濾器

BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);

布隆過濾器中添加元素。

bloomFilter.mightContain(1)

判斷布隆過濾器中是否存在。

bloomFilter.mightContain(1)

3、fpp誤判率

@Service
@Slf4j
public class GuavaBloomFilterService {
    public static final int SIZE = 1000000;

    //誤判率
    public static double fpp = 0.01;

    //創(chuàng)建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("誤判總數(shù)量:{}", list.size());
    }
}

六、Redis緩存擊穿

Redis緩存擊穿是指在Redis緩存系統(tǒng)中,由于某些原因,緩存的數(shù)據(jù)無法被正常訪問或處理,導(dǎo)致緩存失去了它的作用。

1、什么情況會發(fā)生緩存擊穿?

根本原因:熱點Key失效。

(1)數(shù)據(jù)量過大

當(dāng)緩存中存儲的數(shù)據(jù)量過大時,緩存的數(shù)據(jù)量可能會超過Redis的數(shù)據(jù)存儲限制,從而導(dǎo)致緩存失去了它的作用。

(2)數(shù)據(jù)更新頻繁

當(dāng)緩存中存儲的數(shù)據(jù)更新頻繁時,緩存的數(shù)據(jù)可能會出現(xiàn)異步的變化,導(dǎo)致緩存無法被正常訪問。

(3)數(shù)據(jù)過期

當(dāng)緩存中存儲的數(shù)據(jù)過期時,緩存的數(shù)據(jù)可能會失去它的作用,因為Redis會在一定時間后自動將過期的數(shù)據(jù)刪除。

(4)數(shù)據(jù)權(quán)限限制

當(dāng)緩存中存儲的數(shù)據(jù)受到權(quán)限限制時,只有擁有足夠權(quán)限的用戶才能訪問和處理這些數(shù)據(jù),從而導(dǎo)致緩存失去了它的作用。

(5)Redis性能瓶頸

當(dāng)Redis服務(wù)器的性能達到極限時,Redis緩存可能會因為響應(yīng)過慢而導(dǎo)致?lián)舸?/p>

2、如何避免Redis緩存擊穿?

(1)設(shè)置合理的緩存大小

根據(jù)實際需求設(shè)置合理的緩存大小,以避免緩存穿透。

(2)優(yōu)化數(shù)據(jù)結(jié)構(gòu)

根據(jù)實際需求優(yōu)化數(shù)據(jù)結(jié)構(gòu),以減少數(shù)據(jù)的大小和更新頻率。

(3)設(shè)置合理的過期時間

設(shè)置合理的過期時間,以避免緩存失去它的作用。

(4)增加Redis的并發(fā)處理能力

通過增加Redis的并發(fā)處理能力,以提高緩存的處理能力和響應(yīng)速度。

(5)優(yōu)化Redis服務(wù)器的硬件和軟件配置

通過優(yōu)化Redis服務(wù)器的硬件和軟件配置,以提高Redis的性能和處理能力。

七、Redis緩存擊穿解決方案

1、互斥更新

通過雙檢加鎖機制。

2、差異失效時間

圖片

先更新從緩存B,再更新主緩存A,而且讓從緩存B的緩存失效時間長于A,保證A失效時,B還在。

本文轉(zhuǎn)載自微信公眾號「哪吒編程」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系哪吒編程公眾號。

責(zé)任編輯:姜華 來源: 哪吒編程
相關(guān)推薦

2021-03-11 12:27:36

java 變量數(shù)量

2021-04-26 08:16:18

CPU 語言編寫

2021-05-17 18:27:20

Token驗證HTTP

2022-05-10 09:16:50

MQ內(nèi)存消費者

2021-03-04 13:14:54

文件系統(tǒng)存儲

2022-02-07 09:40:10

高可用高并發(fā)高性能

2021-07-14 18:21:50

負(fù)載均衡TCP網(wǎng)關(guān)

2021-02-04 11:01:59

計算機信號轉(zhuǎn)換

2025-01-21 14:11:32

2021-01-14 09:04:24

線程池工具類面試

2024-05-29 08:56:31

2023-03-10 13:33:00

緩存穿透緩存擊穿緩存雪崩

2019-10-12 14:19:05

Redis數(shù)據(jù)庫緩存

2022-03-14 17:56:15

云廠商系統(tǒng)阿里云

2019-11-05 14:24:31

緩存雪崩框架

2024-03-12 10:44:42

2021-06-05 09:01:01

Redis緩存雪崩緩存穿透

2021-12-25 22:28:27

緩存穿透緩存擊穿緩存雪崩

2020-03-16 14:57:24

Redis面試雪崩

2022-07-11 07:36:36

緩存緩存雪崩緩存擊穿
點贊
收藏

51CTO技術(shù)棧公眾號