多模块项目使用枚举配置spring-cache缓存方案详解

 更新时间:2023年05月26日 10:30:35   作者:javalover  
这篇文章主要为大家介绍了多模块项目使用枚举配置spring-cache缓存的方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、前言

  • 近期被刷接口了,考虑增加 本地缓存提高性能,另配置 限流
  • 使用 spring-cache 注解式缓存,可以提高使用缓存的开发效率
  • 不同业务,可以定制 自己的缓存策略,是基本需求
  • 多模块项目,最好在 统一的模块(如 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;
}

业务模块缓存配置:

@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";
  }
}

三、总结

  • 通过 接口 + 枚举,业务模块不用改common模块, 新增枚举 就能 方便的配置、使用缓存,符合 开闭原则
  • 通过 Lombok 的 FieldNameConstants 自动生成 枚举名称常量,便于代码 导航、重构
  • 通过 Reflections 库,common模块自动加载 各模块的缓存配置,SimpleCacheManager 组合 各种不同配置的 缓存(CaffeineCacheManager 不能),降低使用成本,提高可维护性
  • sync = true,加锁,只有一个线程去加载数据,其他线程阻塞,防止 缓存击穿
  • alibaba/jetcache:支持TTL和两级缓存、自动刷新和加载保护 等
  • netease-im/camellia:网易开源,有意思的是 支持基于注解执行mget,mevict等批量操作

以上就是多模块项目使用枚举配置spring-cache缓存方案详解的详细内容,更多关于枚举配置spring cache缓存的资料请关注脚本之家其它相关文章!

相关文章

  • java获取properties属性文件示例

    java获取properties属性文件示例

    Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。本文使用java读取这些属性,看下面详细介绍吧
    2014-01-01
  • 利用JavaFX工具构建Reactive系统

    利用JavaFX工具构建Reactive系统

    这篇文章主要介绍了使用JavaFX构建Reactive系统,利用JavaFX工具集中的新的超棒特性来构建响应式的快速应用程序,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Java后台开发之表单提交之前验证

    Java后台开发之表单提交之前验证

    这篇文章主要介绍了Java后台开发之表单提交之前验证的实现代码,非常不错具有参考借鉴价值,需要的朋友参考下吧
    2017-02-02
  • SpringBoot项目中Maven剔除无用Jar引用的最佳实践

    SpringBoot项目中Maven剔除无用Jar引用的最佳实践

    在 Spring Boot 项目开发中,Maven 是最常用的构建工具之一,通过 Maven,我们可以轻松地管理项目所需的依赖,而,随着项目的复杂化,无用的 Jar 包引用可能会逐渐增多,本文旨在详细解析如何在 Spring Boot 项目中剔除无用的 Jar 引用,需要的朋友可以参考下
    2025-01-01
  • Java中的volatile关键字多方面解析

    Java中的volatile关键字多方面解析

    volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以避免复合操作问题,本文给大家解析Java中的volatile关键字,感兴趣的朋友一起看看吧
    2025-08-08
  • JAVA字符串格式化-String.format()的使用

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

    本篇文章主要介绍了JAVA字符串格式化-String.format()的使用,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • mybatisPlus实现逻辑删除,自动生成创建时间和更新时间方式

    mybatisPlus实现逻辑删除,自动生成创建时间和更新时间方式

    MyBatisPlus框架中,通过@TableField(fill=FieldFill.INSERT)和@TableField(fill=FieldFill.UPDATE)注解可以实现在插入和更新时自动填充字段,比如创建时间和更新时间,使用@TableLogic注解标识逻辑删除字段
    2024-09-09
  • 详解Nacos中注册中心和配置中心的实现

    详解Nacos中注册中心和配置中心的实现

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心,我们今天来了解和实现一下二者
    2022-08-08
  • java 时区时间转为UTC的实现

    java 时区时间转为UTC的实现

    Java提供了多种方式来实现时区时间转换为UTC时间,包括使用java.util.Date和java.util.Calendar以及Java 8中新增的java.time包,下面就来介绍一下
    2024-08-08
  • Java 知识难点之异常的认知与使用详解

    Java 知识难点之异常的认知与使用详解

    所谓异常是指程序在运行时出现错误时提示调用者的机制,异常的种类有很多,不同种类的异常有不同的含义,也有不同的处理方式,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09

最新评论