最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

多模塊項目使用枚舉配置spring-cache緩存方案詳解

 更新時間:2023年05月26日 10:30:35   作者:javalover  
這篇文章主要為大家介紹了多模塊項目使用枚舉配置spring-cache緩存的方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、前言

  • 近期被刷接口了,考慮增加 本地緩存提高性能,另配置 限流
  • 使用 spring-cache 注解式緩存,可以提高使用緩存的開發(fā)效率
  • 不同業(yè)務(wù),可以定制 自己的緩存策略,是基本需求
  • 多模塊項目,最好在 統(tǒng)一的模塊(如 common) 加載緩存配置

二、方案

1. 配置緩存:接口 + 枚舉 + Lombok

緩存配置接口:

public interface ICacheConfig {
    Integer getTtl();
}

common模塊緩存配置(使用 Lombok 的 FieldNameConstants 自動生成 常量):

@lombok.Getter
@lombok.AllArgsConstructor
@lombok.experimental.FieldNameConstants(onlyExplicitlyIncluded = true)
public enum CommonCacheConfig implements ICacheConfig {
    @FieldNameConstants.Include QUOTE_LEVEL(1000, 2);
    private final Integer ttl;
}

業(yè)務(wù)模塊緩存配置:

@lombok.Getter
@lombok.AllArgsConstructor
@lombok.experimental.FieldNameConstants(onlyExplicitlyIncluded = true)
public enum QuoteServiceCacheConfig implements ICacheConfig {
    @FieldNameConstants.Include HOT_STOCK(1000, 30);
    private final Integer ttl;
}

2. 多模塊配置加載:Reflections + SimpleCacheManager

  • 通過 Reflections 庫加載多模塊配置

SimpleCacheManager 組合 各種不同配置的 緩存

@EnableCaching
@Configuration
public class CacheConfig {
  private Logger log = LoggerFactory.getLogger(this.getClass());
  @Bean
  @Primary
  public CacheManager cacheManager() {
      final SimpleCacheManager cacheManager = new SimpleCacheManager();
      final String prefix = "package";
Set<Class<? extends ICacheConfig>> classes = new Reflections(prefix).getSubTypesOf(ICacheConfig.class);
        log.info("cache types|{}|{}", prefix, classes);
        List<Cache> caches = classes.stream().flatMap(clazz -> Arrays.stream(clazz.getEnumConstants())).map(config -> {
            final Caffeine<Object, Object> cache = Caffeine.newBuilder().recordStats();
            Optional.ofNullable(config.getTtl()).ifPresent(t -> cache.expireAfterWrite(t, TimeUnit.SECONDS));
            return new CaffeineCache(((Enum) config).name(), cache.build());
        }).collect(Collectors.toList());
        cacheManager.setCaches(caches);
        return cacheManager;
    }

3. 使用緩存

  • 使用 @Cacheable(cacheNames = CommonCacheConfig.Fields.QUOTE_LEVEL, sync = true) 操作緩存

使用 Lombok 的 FieldNameConstants 自動生成的 常量:

public enum CommonCacheConfig implements ICacheConfig {
  public static final class Fields {
      public static final String QUOTE_LEVEL = "QUOTE_LEVEL";
  }
}

三、總結(jié)

  • 通過 接口 + 枚舉,業(yè)務(wù)模塊不用改common模塊, 新增枚舉 就能 方便的配置、使用緩存,符合 開閉原則
  • 通過 Lombok 的 FieldNameConstants 自動生成 枚舉名稱常量,便于代碼 導(dǎo)航、重構(gòu)
  • 通過 Reflections 庫,common模塊自動加載 各模塊的緩存配置,SimpleCacheManager 組合 各種不同配置的 緩存(CaffeineCacheManager 不能),降低使用成本,提高可維護性
  • sync = true,加鎖,只有一個線程去加載數(shù)據(jù),其他線程阻塞,防止 緩存擊穿
  • alibaba/jetcache:支持TTL和兩級緩存、自動刷新和加載保護 等
  • netease-im/camellia:網(wǎng)易開源,有意思的是 支持基于注解執(zhí)行mget,mevict等批量操作

以上就是多模塊項目使用枚舉配置spring-cache緩存方案詳解的詳細(xì)內(nèi)容,更多關(guān)于枚舉配置spring cache緩存的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java獲取properties屬性文件示例

    java獲取properties屬性文件示例

    Properties類表示了一個持久的屬性集。Properties可保存在流中或從流中加載。屬性列表中每個鍵及其對應(yīng)值都是一個字符串。本文使用java讀取這些屬性,看下面詳細(xì)介紹吧
    2014-01-01
  • 利用JavaFX工具構(gòu)建Reactive系統(tǒng)

    利用JavaFX工具構(gòu)建Reactive系統(tǒng)

    這篇文章主要介紹了使用JavaFX構(gòu)建Reactive系統(tǒng),利用JavaFX工具集中的新的超棒特性來構(gòu)建響應(yīng)式的快速應(yīng)用程序,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Java后臺開發(fā)之表單提交之前驗證

    Java后臺開發(fā)之表單提交之前驗證

    這篇文章主要介紹了Java后臺開發(fā)之表單提交之前驗證的實現(xiàn)代碼,非常不錯具有參考借鑒價值,需要的朋友參考下吧
    2017-02-02
  • SpringBoot項目中Maven剔除無用Jar引用的最佳實踐

    SpringBoot項目中Maven剔除無用Jar引用的最佳實踐

    在?Spring?Boot?項目開發(fā)中,Maven?是最常用的構(gòu)建工具之一,通過?Maven,我們可以輕松地管理項目所需的依賴,而,隨著項目的復(fù)雜化,無用的?Jar?包引用可能會逐漸增多,本文旨在詳細(xì)解析如何在?Spring?Boot?項目中剔除無用的?Jar?引用,需要的朋友可以參考下
    2025-01-01
  • Java中的volatile關(guān)鍵字多方面解析

    Java中的volatile關(guān)鍵字多方面解析

    volatile用于保證多線程變量可見性與禁止重排序,適用于狀態(tài)標(biāo)志、單例模式等場景,但不保證原子性,相較synchronized更輕量,但需謹(jǐn)慎使用以避免復(fù)合操作問題,本文給大家解析Java中的volatile關(guān)鍵字,感興趣的朋友一起看看吧
    2025-08-08
  • JAVA字符串格式化-String.format()的使用

    JAVA字符串格式化-String.format()的使用

    本篇文章主要介紹了JAVA字符串格式化-String.format()的使用,具有一定的參考價值,有需要的可以了解一下。
    2016-11-11
  • mybatisPlus實現(xiàn)邏輯刪除,自動生成創(chuàng)建時間和更新時間方式

    mybatisPlus實現(xiàn)邏輯刪除,自動生成創(chuàng)建時間和更新時間方式

    MyBatisPlus框架中,通過@TableField(fill=FieldFill.INSERT)和@TableField(fill=FieldFill.UPDATE)注解可以實現(xiàn)在插入和更新時自動填充字段,比如創(chuàng)建時間和更新時間,使用@TableLogic注解標(biāo)識邏輯刪除字段
    2024-09-09
  • 詳解Nacos中注冊中心和配置中心的實現(xiàn)

    詳解Nacos中注冊中心和配置中心的實現(xiàn)

    Spring?Cloud?Alibaba?是阿里巴巴提供的一站式微服務(wù)開發(fā)解決方案。而?Nacos?作為?Spring?Cloud?Alibaba?的核心組件之一,提供了兩個非常重要的功能:注冊中心和配置中心,我們今天來了解和實現(xiàn)一下二者
    2022-08-08
  • java?時區(qū)時間轉(zhuǎn)為UTC的實現(xiàn)

    java?時區(qū)時間轉(zhuǎn)為UTC的實現(xiàn)

    Java提供了多種方式來實現(xiàn)時區(qū)時間轉(zhuǎn)換為UTC時間,包括使用java.util.Date和java.util.Calendar以及Java?8中新增的java.time包,下面就來介紹一下
    2024-08-08
  • Java 知識難點之異常的認(rèn)知與使用詳解

    Java 知識難點之異常的認(rèn)知與使用詳解

    所謂異常是指程序在運行時出現(xiàn)錯誤時提示調(diào)用者的機制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09

最新評論

新龙县| 黎平县| 塘沽区| 洛阳市| 文昌市| 裕民县| 巨鹿县| 新民市| 易门县| 中西区| 黄大仙区| 扎兰屯市| 嵩明县| 观塘区| 夏津县| 大宁县| 叶城县| 甘孜县| 扶余县| 安吉县| 巴林左旗| 玉树县| 大荔县| 民和| 青川县| 平邑县| 化德县| 保德县| 闸北区| 龙江县| 永寿县| 正镶白旗| 哈尔滨市| 巴青县| 青浦区| 蕉岭县| 西城区| 白山市| 达尔| 南平市| 涟源市|