成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

第一次使用緩存,因為沒預熱,翻車了

存儲
我們使用 Caffeine.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES) 配置了緩存的自動刷新機制,即每個緩存項在寫入后的1分鐘內,如果有讀請求,Caffeine 會自動觸發數據的刷新。

預熱一般指緩存預熱,一般用在高并發系統中,為了提升系統在高并發情況下的穩定性的一種手段。

緩存預熱是指在系統啟動之前或系統達到高峰期之前,通過預先將常用數據加載到緩存中,以提高緩存命中率和系統性能的過程。緩存預熱的目的是盡可能地避免緩存擊穿和緩存雪崩,還可以減輕后端存儲系統的負載,提高系統的響應速度和吞吐量。

預熱的必要性

緩存預熱的好處有很多,如:

  1. 減少冷啟動影響:當系統重啟或新啟動時,緩存是空的,這被稱為冷啟動。冷啟動可能導致首次請求處理緩慢,因為數據需要從慢速存儲(如數據庫)檢索。
  2. 提高數據訪問速度:通過預先加載常用數據到緩存中,可以確保數據快速可用,從而加快數據訪問速度。
  3. 平滑流量峰值:在流量高峰期之前預熱緩存可以幫助系統更好地處理高流量,避免在流量激增時出現性能下降。
  4. 保證數據的時效性:定期預熱可以保證緩存中的數據是最新的,特別是對于高度依賴于實時數據的系統。
  5. 減少對后端系統的壓力:通過緩存預熱,可以減少對數據庫或其他后端服務的直接查詢,從而減輕它們的負載。

預熱的方法

緩存預熱的一般做法是在系統啟動或系統空閑期間,將常用的數據加載到緩存中,主要做法有以下幾種:

系統啟動時加載:在系統啟動時,將常用的數據加載到緩存中,以便后續的訪問可以直接從緩存中獲取。

定時任務加載:定時執行任務,將常用的數據加載到緩存中,以保持緩存中數據的實時性和準確性。

手動觸發加載:在系統達到高峰期之前,手動觸發加載常用數據到緩存中,以提高緩存命中率和系統性能。

用時加載:在用戶請求到來時,根據用戶的訪問模式和業務需求,動態地將數據加載到緩存中。

緩存加載器:一些緩存框架提供了緩存加載器的機制,可以在緩存中不存在數據時,自動調用加載器加載數據到緩存中。

Redis預熱

在分布式緩存中,我們通常都是使用Redis,針對Redis的預熱,有以下幾個工具可供使用,幫助我們實現緩存的預熱:

RedisBloom:RedisBloom是Redis的一個模塊,提供了多個數據結構,包括布隆過濾器、計數器、和TopK數據結構等。其中,布隆過濾器可以用于Redis緩存預熱,通過將預熱數據添加到布隆過濾器中,可以快速判斷一個鍵是否存在于緩存中。

Redis Bulk loading:這是一個官方出的,基于Redis協議批量寫入數據的工具

Redis Desktop Manager:Redis Desktop Manager是一個圖形化的Redis客戶端,可以用于管理Redis數據庫和進行緩存預熱。通過Redis Desktop Manager,可以輕松地將預熱數據批量導入到Redis緩存中。

應用啟動時預熱

ApplicationReadyEvent

在應用程序啟動時,可以通過監聽應用啟動事件,或者在應用的初始化階段,將需要緩存的數據加載到緩存中。

ApplicationReadyEvent 是 Spring Boot 框架中的一個事件類,它表示應用程序已經準備好接收請求,即應用程序已啟動且上下文已刷新。這個事件是在 ApplicationContext 被初始化和刷新,并且應用程序已經準備好處理請求時觸發的。

基于ApplicationReadyEvent,我們可以在應用程序完全啟動并處于可用狀態后執行一些初始化邏輯。使用 @EventListener 注解或實現 ApplicationListener 接口來監聽這個事件。例如,使用 @EventListener 注解:

@EventListener(ApplicationReadyEvent.class)
public void preloadCache() {
    // 在應用啟動后執行緩存預熱邏輯
    // ...
}

Runner

如果你不想直接監聽ApplicationReadyEvent,在SpringBoot中,也可以通過CommandLineRunner 和 ApplicationRunner 來實現這個功能。

CommandLineRunner 和 ApplicationRunner 是 Spring Boot 中用于在應用程序啟動后執行特定邏輯的接口。這解釋聽上去就像是專門干這個事兒的。

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 在應用啟動后執行緩存預熱邏輯
        // ...
    }
}

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 在應用啟動后執行緩存預熱邏輯
        // ...
    }

}

CommandLineRunner 和 ApplicationRunner的調用,是在SpringApplication的run方法中

其實就是callRunners(context, applicationArguments);的實現:

private void callRunners(ApplicationContext context, ApplicationArguments args) {
    List<Object> runners = new ArrayList<>();
    runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
    runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
    AnnotationAwareOrderComparator.sort(runners);
    for (Object runner : new LinkedHashSet<>(runners)) {
        if (runner instanceof ApplicationRunner) {
            callRunner((ApplicationRunner) runner, args);
        }
        if (runner instanceof CommandLineRunner) {
            callRunner((CommandLineRunner) runner, args);
        }
    }
}

使用InitializingBean接口

實現 InitializingBean 接口,并在 afterPropertiesSet 方法中執行緩存預熱的邏輯。這樣,Spring 在初始化 Bean 時會調用 afterPropertiesSet 方法。

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

@Component
public class CachePreloader implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 執行緩存預熱邏輯
        // ...
    }
}

這個方法的調用我們在Spring的啟動流程中也介紹過,不再展開了

使用@PostConstruct注解

類似的,我們還可以使用 @PostConstruct 注解標注一個方法,該方法將在 Bean 的構造函數執行完畢后立即被調用。在這個方法中執行緩存預熱的邏輯。

import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class CachePreloader {

    @PostConstruct
    public void preloadCache() {
        // 執行緩存預熱邏輯
        // ...
    }
}

定時任務預熱

在啟動過程中預熱有一個問題,那就是一旦啟動之后,如果需要預熱新的數據,或者需要修改數據,就不支持了,那么,在應用的運行過程中,我們也是可以通過定時任務來實現緩存的更新預熱的。

我們通常依賴這種方式來確保緩存中的數據是最新的,避免因為業務數據的變化而導致緩存數據過時。

在Spring中,想要實現一個定時任務也挺簡單的,基于@Scheduled就可以輕易實現.

@Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1點執行
public void scheduledCachePreload() {
    // 執行緩存預熱邏輯
    // ...
}

也可以依賴xxl-job等定時任務實現。

緩存器預熱

些緩存框架提供了緩存加載器的機制,可以在緩存中不存在數據時,自動調用加載器加載數據到緩存中。這樣可以簡化緩存預熱的邏輯。如Caffeine中就有這樣的功能:

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class MyCacheService {

    private final LoadingCache<String, String> cache;

    public MyCacheService() {
        this.cache = Caffeine.newBuilder()
                .refreshAfterWrite(1, TimeUnit.MINUTES)  // 配置自動刷新,1分鐘刷新一次
                .build(key -> loadDataFromSource(key));  // 使用加載器加載數據
    }

    public String getValue(String key) {
        return cache.get(key);
    }

    private String loadDataFromSource(String key) {
        // 從數據源加載數據的邏輯
        // 這里只是一個示例,實際應用中可能是從數據庫、外部服務等獲取數據
        System.out.println("Loading data for key: " + key);
        return "Value for " + key;
    }
}

在上面的例子中,我們使用 Caffeine.newBuilder().refreshAfterWrite(1, TimeUnit.MINUTES) 配置了緩存的自動刷新機制,即每個緩存項在寫入后的1分鐘內,如果有讀請求,Caffeine 會自動觸發數據的刷新。

loadDataFromSource 方法是用于加載數據的自定義方法。你可以在這個方法中實現從數據源(例如數據庫、外部服務)加載數據的邏輯。

責任編輯:武曉燕 來源: Hollis
相關推薦

2011-07-21 21:01:37

諾基亞塞班蘋果

2024-08-08 08:50:21

標簽頁portTab

2022-05-06 11:27:23

虛擬人白皮書行業

2017-03-22 15:38:28

代碼架構Java

2023-09-11 00:14:46

后端團隊項目

2019-07-31 15:14:33

2022-03-16 14:59:28

打包debian模板文件

2012-04-13 10:11:58

Windows 8泄露

2022-08-15 08:16:56

shiroWeb認證

2022-06-21 09:26:28

開源項目PR

2015-10-26 16:38:17

2021-02-05 08:35:21

私活程序員

2017-09-01 14:00:04

操作系統蘋果OS X系統

2018-01-17 10:52:56

惠普聯想PC

2018-09-11 17:05:12

戴爾

2013-05-13 11:35:53

獨立開發開發經驗開發感悟

2013-06-03 09:28:49

游戲設計

2010-05-27 10:00:09

2024-07-09 10:20:05

VueJSX函數

2021-07-05 22:09:53

面試官CollectionsJDK7
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美极品视频在线观看 | 我要看黄色录像一级片 | 中文字幕亚洲视频 | 日本不卡一区二区三区在线观看 | 亚洲精品一区二区三区在线 | 欧美男人的天堂 | 久久精品无码一区二区三区 | 日韩精品成人 | 国产人成精品一区二区三 | 欧美精品福利 | 秋霞电影一区二区三区 | 午夜视频一区 | 99久久精品国产一区二区三区 | 一区二区国产在线 | 日韩av美女电影 | 青娱乐av| 妖精视频一区二区三区 | 黄色一级片aaa | 欧美日韩一区二区三区在线观看 | 国产超碰人人爽人人做人人爱 | 亚洲一二三区在线观看 | 日本成人福利视频 | 6996成人影院网在线播放 | 日本不卡一区二区 | 日本在线网站 | av毛片 | av av在线| 国产精品毛片一区二区在线看 | 欧美日韩免费视频 | 欧美日韩视频网站 | 久久蜜桃av一区二区天堂 | 久久久网 | 久久高清精品 | 日韩网站免费观看 | 天天操夜夜操 | 九九热精品视频 | av在线播放一区二区 | 亚洲欧洲日韩精品 中文字幕 | 成人国产在线视频 | 色综合天天综合网国产成人网 | 亚洲二区视频 |