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

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

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

一、前言

  • 近期被刷接口了,考慮增加 本地緩存提高性能,另配置 限流
  • 使用 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 不能),降低使用成本,提高可維護(hù)性
  • sync = true,加鎖,只有一個線程去加載數(shù)據(jù),其他線程阻塞,防止 緩存擊穿
  • alibaba/jetcache:支持TTL和兩級緩存、自動刷新和加載保護(hù) 等
  • netease-im/camellia:網(wǎng)易開源,有意思的是 支持基于注解執(zhí)行mget,mevict等批量操作

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

相關(guān)文章

  • Java動態(tài)代理和AOP應(yīng)用示例

    Java動態(tài)代理和AOP應(yīng)用示例

    這篇文章主要介紹了Java動態(tài)代理和AOP應(yīng)用,結(jié)合實(shí)例形式分析了java動態(tài)代理在AOP面向切面編程中的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-07-07
  • 使用postman傳遞list集合后臺springmvc接收

    使用postman傳遞list集合后臺springmvc接收

    這篇文章主要介紹了使用postman傳遞list集合后臺springmvc接收的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot項目配置多個kafka的示例代碼

    springboot項目配置多個kafka的示例代碼

    這篇文章主要介紹了springboot項目配置多個kafka,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • SpringBoot通過yml和xml文件配置日志輸出方法

    SpringBoot通過yml和xml文件配置日志輸出方法

    這篇文章主要介紹了SpringBoot通過yml和xml文件配置日志輸出方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • SpringBoot解決BigDecimal傳到前端后精度丟失問題

    SpringBoot解決BigDecimal傳到前端后精度丟失問題

    這篇文章將通過示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-06-06
  • SpringJPA?做分頁條件查詢的代碼實(shí)踐

    SpringJPA?做分頁條件查詢的代碼實(shí)踐

    相信小伙伴們的項目很多都用到SpringJPA框架的吧,對于單表的增刪改查利用jpa是很方便的,但是對于條件查詢并且分頁?是不是很多小伙伴不經(jīng)常寫到,今天給大家分享SpringJPA?做分頁條件查詢的案例代碼,感興趣的朋友一起看看吧
    2024-03-03
  • RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求解析

    RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求解析

    這篇文章主要為大家介紹了RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 利用java反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法

    利用java反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法

    下面小編就為大家?guī)硪黄胘ava反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • Spring中的BeanFactory工廠詳細(xì)解析

    Spring中的BeanFactory工廠詳細(xì)解析

    這篇文章主要介紹了Spring中的BeanFactory工廠詳細(xì)解析,Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用,需要的朋友可以參考下
    2023-12-12
  • Java中的Optional類用法詳細(xì)講解

    Java中的Optional類用法詳細(xì)講解

    這篇文章詳細(xì)介紹了Java中Optional類的使用,包括創(chuàng)建Optional對象,Optional對象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional類結(jié)合Lambda表達(dá)式和StreamAPI的使用,需要的朋友可以參考下
    2024-10-10

最新評論