欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis中緩存預(yù)熱與緩存穿透解決方案

 更新時(shí)間:2023年12月11日 10:11:13   作者:格林希爾  
Redis緩存預(yù)熱與緩存穿透是Redis緩存使用中的兩個(gè)重要概念,文章首先介紹了Redis緩存預(yù)熱和緩存穿透的基本概念,然后詳細(xì)闡述了它們的產(chǎn)生原因和解決方案,感興趣的可以了解一下

一、簡(jiǎn)介

1.1 簡(jiǎn)介

Redis是一個(gè)用于數(shù)據(jù)緩存、消息代理、持久化存儲(chǔ)的內(nèi)存型數(shù)據(jù)庫(kù)。Redis的特點(diǎn)是高性能、高并發(fā)、支持豐富的數(shù)據(jù)類(lèi)型,可以實(shí)現(xiàn)多種應(yīng)用場(chǎng)景。

1.2 緩存預(yù)熱 穿透

緩存預(yù)熱是在系統(tǒng)開(kāi)始運(yùn)行之前,將數(shù)據(jù)加入緩存中。這樣在后續(xù)的請(qǐng)求中,可以直接從緩存中讀取數(shù)據(jù),提高了系統(tǒng)的性能和響應(yīng)速度。

緩存穿透是指查詢(xún)一個(gè)不存在的數(shù)據(jù),這會(huì)導(dǎo)致大量請(qǐng)求直接打到數(shù)據(jù)庫(kù)上,影響數(shù)據(jù)庫(kù)的性能。緩存穿透可以通過(guò)在緩存層增加布隆過(guò)濾器等進(jìn)行解決。

二、緩存預(yù)熱

2.1 緩存預(yù)熱基本原理

緩存預(yù)熱的基本原理:程序啟動(dòng)或重啟的時(shí)候,將需要經(jīng)常訪(fǎng)問(wèn)的數(shù)據(jù),提前加載到緩存當(dāng)中,以便后續(xù)直接讀取。

2.2 Redis 緩存預(yù)熱實(shí)現(xiàn)

2.2.1 基于數(shù)據(jù)量預(yù)熱

根據(jù)數(shù)據(jù)量的大小進(jìn)行預(yù)熱,比較常見(jiàn)的方法是在程序啟動(dòng)時(shí),讀取所有的數(shù)據(jù),將數(shù)據(jù)全部寫(xiě)入緩存當(dāng)中,以此實(shí)現(xiàn)緩存預(yù)熱。其優(yōu)點(diǎn)是預(yù)熱完成后,可以避免緩存穿透;缺點(diǎn)是數(shù)據(jù)量大的時(shí)候,預(yù)熱的時(shí)間較長(zhǎng)。

2.2.2 基于時(shí)間預(yù)熱

根據(jù)數(shù)據(jù)最近的更新時(shí)間和訪(fǎng)問(wèn)頻率,對(duì)數(shù)據(jù)進(jìn)行預(yù)熱。比如最近7天讀取頻率比較高的數(shù)據(jù),在程序啟動(dòng)時(shí)就可以進(jìn)行預(yù)熱。其優(yōu)點(diǎn)是可以提高預(yù)熱效率;缺點(diǎn)是無(wú)法避免緩存穿透。

2.2.3 周期性預(yù)熱

周期性預(yù)熱是指定期間內(nèi)進(jìn)行緩存預(yù)熱,以保證系統(tǒng)的高效性。比如每天凌晨1點(diǎn)進(jìn)行緩存預(yù)熱,以此保證當(dāng)系統(tǒng)高峰期到來(lái)時(shí),能夠有足夠的緩存支持。其優(yōu)點(diǎn)是預(yù)熱時(shí)間可控,缺點(diǎn)是可能不能覆蓋到所有的數(shù)據(jù)。

public class RedisCachePreheating {

    /**
     * 緩存預(yù)熱:基于數(shù)據(jù)量預(yù)熱
     */
    public void preheatByDataSize(){
        // 讀取所有數(shù)據(jù)
        List<Data> dataList = readAllData();
        for(Data data : dataList){
            // 將數(shù)據(jù)寫(xiě)入緩存
            writeToCache(data);
        }
    }
  
    /**
     * 緩存預(yù)熱:基于時(shí)間預(yù)熱
     */
    public void preheatByTime(){
        // 獲取最近7天的數(shù)據(jù)列表
        List<Data> dataList = readDataByTime(7);
        for(Data data : dataList){
            // 將數(shù)據(jù)寫(xiě)入緩存
            writeToCache(data);
        }
    }

    /**
     * 緩存預(yù)熱:周期性預(yù)熱
     */
    public void periodPreheat(){
        // 每隔1小時(shí)預(yù)熱一次
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 預(yù)熱操作,類(lèi)似于preheatByDataSize()或preheatByTime()
            }
        }, 0, 60 * 60 * 1000);
    }
}

三、緩存穿透

3.1 緩存穿透基本原理

緩存穿透是指當(dāng)一個(gè)查詢(xún)不存在于緩存中,而且每次查詢(xún)也都不會(huì)被緩存時(shí),就會(huì)直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。如果出現(xiàn)大量查詢(xún)結(jié)果不存在的情況,就可能導(dǎo)致數(shù)據(jù)庫(kù)崩潰。緩存穿透的原因可能是因?yàn)椴樵?xún)的條件非常特殊或者惡意攻擊。

3.2 Redis 緩存穿透解決方案

以下是常見(jiàn)的 Redis 緩存穿透解決方案:

3.2.1 布隆過(guò)濾器

布隆過(guò)濾器是一種內(nèi)存型、不可逆的數(shù)據(jù)結(jié)構(gòu)。它使用哈希函數(shù)來(lái)判斷一個(gè)元素是否在集合中。因?yàn)樗挠?jì)算量小且運(yùn)行速度快,所以通常被用作解決緩存穿透和大數(shù)據(jù)去重等問(wèn)題。

在 Redis 中,我們可以使用 RedisBloom 模塊來(lái)實(shí)現(xiàn)布隆過(guò)濾器。

Java 實(shí)現(xiàn)布隆過(guò)濾器的代碼示例:

// 創(chuàng)建布隆過(guò)濾器并將其添加到 Redis 中
Jedis jedis = new Jedis("localhost", 6379);
RedisBloomFilter<Integer> bloomFilter = RedisBloomFilter.create(jedis, "bloom", 1000, 0.01);
bloomFilter.add(42);
// 檢查元素是否存在于集合中
bloomFilter.contains(42); // 返回 true
bloomFilter.contains(666); // 返回 false

3.2.2 緩存空對(duì)象

當(dāng)緩存查詢(xún)結(jié)果為空時(shí),我們可以將這個(gè)空對(duì)象添加到緩存中。這樣下次同樣的查詢(xún)就會(huì)命中緩存,而不用去訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)了。

Java 實(shí)現(xiàn)緩存空對(duì)象的代碼示例:

// 查詢(xún)緩存。
Object result = redisTemplate.opsForValue().get(key);
if(result == null) {
    // 查詢(xún)數(shù)據(jù)庫(kù)。
    result = dao.query(key);
    // 將查詢(xún)結(jié)果添加到緩存,有效期設(shè)置為 5 分鐘。
    redisTemplate.opsForValue().set(key, result, Duration.ofMinutes(5));
}

3.2.3 限流

使用限流可以防止惡意攻擊。

可以使用 Redis 的計(jì)數(shù)器和時(shí)間窗口算法來(lái)將高并發(fā)請(qǐng)求控制在一個(gè)較低的速率內(nèi)。

Java 實(shí)現(xiàn)簡(jiǎn)單限流的代碼示例:

// 獲取當(dāng)前時(shí)間戳。
long now = Instant.now().getEpochSecond();
// 在 Redis 中記錄這 1 秒鐘內(nèi)的請(qǐng)求次數(shù)。
long current = redisTemplate.opsForValue().increment(key, 1);
// 設(shè)置有效期為 1 秒鐘。
redisTemplate.expire(key, 1, TimeUnit.SECONDS);
if(current > maxRequests) {
    // 請(qǐng)求次數(shù)超限,返回失敗。
    return new Response(false, "too many requests");
} else {
    // 請(qǐng)求次數(shù)未超限。
    // 如果是第一個(gè)請(qǐng)求,設(shè)置過(guò)期時(shí)間為 1 秒鐘。
    redisTemplate.opsForValue().setIfAbsent(key, "", Duration.ofSeconds(1));
    return new Response(true, "");
}

四、應(yīng)用實(shí)踐

4.1 在 Spring Boot 中使用 Redis 緩存預(yù)熱和緩存穿透解決方案

在 Spring Boot 中,我們可以使用注解來(lái)實(shí)現(xiàn)緩存預(yù)熱和緩存穿透解決方案。

首先,我們需要添加 Spring Cache 和 Redis 相關(guān)的依賴(lài),并配置 RedisTemplate 和緩存管理器。然后,我們可以在 Service 層的方法上使用 @Cacheable 注解來(lái)開(kāi)啟緩存,例如:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private RedisTemplate<String, User> redisTemplate;

    @Cacheable(value = "user", key = "#id")
    public User get(int id) {
        // 直接從數(shù)據(jù)庫(kù)中獲取用戶(hù)。
        return userDao.get(id);
    }
}

4.2 在分布式系統(tǒng)中使用 Redis 緩存預(yù)熱和緩存穿透解決方案

在分布式系統(tǒng)中,我們可以使用 Redisson 或者其他類(lèi)似的分布式鎖來(lái)避免重復(fù)預(yù)熱和處理緩存穿透。

例如,我們可以在所有服務(wù)器都停止服務(wù)前,將緩存數(shù)據(jù)寫(xiě)入 Redis 中,并加上分布式鎖來(lái)保證只有一個(gè)服務(wù)能夠進(jìn)行預(yù)熱。另外,我們也可以使用分布式鎖來(lái)避免緩存穿透導(dǎo)致的數(shù)據(jù)庫(kù)崩潰等問(wèn)題。

到此這篇關(guān)于Redis中緩存預(yù)熱與緩存穿透解決方案的文章就介紹到這了,更多相關(guān)Redis 緩存預(yù)熱與緩存穿透內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis中跳表zset的具體使用

    redis中跳表zset的具體使用

    Redis跳表zset是一種結(jié)合了跳表和有序集合的高效數(shù)據(jù)結(jié)構(gòu),適用于實(shí)現(xiàn)排序和大規(guī)模數(shù)據(jù)的快速查詢(xún),本文主要介紹了redis中跳表zset的具體使用,感興趣的可以了解一下
    2024-01-01
  • 詳解Redis如何處理Hash沖突

    詳解Redis如何處理Hash沖突

    在 Redis 中,哈希表是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),通常用于存儲(chǔ)對(duì)象的屬性,對(duì)于哈希表,最常遇到的是哈希沖突,那么,當(dāng) Redis遇到Hash沖突會(huì)如何處理?本文我們將詳細(xì)介紹Redis如何處理哈希沖突,需要的朋友可以參考下
    2024-09-09
  • Redis實(shí)現(xiàn)多級(jí)緩存

    Redis實(shí)現(xiàn)多級(jí)緩存

    這篇文章主要為大家詳細(xì)介紹了Redis實(shí)現(xiàn)多級(jí)緩存,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • ?Redis 串行生成順序編碼的方法實(shí)現(xiàn)

    ?Redis 串行生成順序編碼的方法實(shí)現(xiàn)

    本文主要介紹了?Redis 串行生成順序編碼的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    這篇文章主要介紹了Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Redis?生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn)

    Redis?生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn)

    在業(yè)務(wù)系統(tǒng)中很多場(chǎng)景下需要生成不重復(fù)的ID,本文主要介紹了Redis生成分布式業(yè)務(wù)單號(hào)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐

    Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐

    實(shí)時(shí)統(tǒng)計(jì)和展示熱門(mén)內(nèi)容是一種常見(jiàn)的需求,本文主要介紹了Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能

    Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能

    Redis是一個(gè)著名的key-value存儲(chǔ)系統(tǒng),也是nosql中的最常見(jiàn)的一種,這篇文章主要給大家介紹Jedis操作Redis實(shí)現(xiàn)模擬驗(yàn)證碼發(fā)送功能,感興趣的朋友一起看看吧
    2021-09-09
  • Centos7 Redis主從搭建配置的實(shí)現(xiàn)

    Centos7 Redis主從搭建配置的實(shí)現(xiàn)

    這篇文章主要介紹了Centos7 Redis主從搭建配置的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Redis主從同步配置的方法步驟(圖文)

    Redis主從同步配置的方法步驟(圖文)

    這篇文章主要介紹了Redis主從同步配置的方法步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論