多模块项目使用枚举配置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动态代理和AOP应用示例

    Java动态代理和AOP应用示例

    这篇文章主要介绍了Java动态代理和AOP应用,结合实例形式分析了java动态代理在AOP面向切面编程中的相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-07-07
  • 使用postman传递list集合后台springmvc接收

    使用postman传递list集合后台springmvc接收

    这篇文章主要介绍了使用postman传递list集合后台springmvc接收的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot项目配置多个kafka的示例代码

    springboot项目配置多个kafka的示例代码

    这篇文章主要介绍了springboot项目配置多个kafka,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • SpringBoot通过yml和xml文件配置日志输出方法

    SpringBoot通过yml和xml文件配置日志输出方法

    这篇文章主要介绍了SpringBoot通过yml和xml文件配置日志输出方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • SpringBoot解决BigDecimal传到前端后精度丢失问题

    SpringBoot解决BigDecimal传到前端后精度丢失问题

    这篇文章将通过示例详细为大家介绍SpringBoot如何解决BigDecimal传到前端后精度丢失问题,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-06-06
  • SpringJPA 做分页条件查询的代码实践

    SpringJPA 做分页条件查询的代码实践

    相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到,今天给大家分享SpringJPA 做分页条件查询的案例代码,感兴趣的朋友一起看看吧
    2024-03-03
  • RocketMQ broker 消息投递流程处理PULL_MESSAGE请求解析

    RocketMQ broker 消息投递流程处理PULL_MESSAGE请求解析

    这篇文章主要为大家介绍了RocketMQ broker 消息投递流程处理PULL_MESSAGE请求源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 利用java反射机制实现自动调用类的简单方法

    利用java反射机制实现自动调用类的简单方法

    下面小编就为大家带来一篇利用java反射机制实现自动调用类的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Spring中的BeanFactory工厂详细解析

    Spring中的BeanFactory工厂详细解析

    这篇文章主要介绍了Spring中的BeanFactory工厂详细解析,Spring的本质是一个bean工厂(beanFactory)或者说bean容器,它按照我们的要求,生产我们需要的各种各样的bean,提供给我们使用,需要的朋友可以参考下
    2023-12-12
  • Java中的Optional类用法详细讲解

    Java中的Optional类用法详细讲解

    这篇文章详细介绍了Java中Optional类的使用,包括创建Optional对象,Optional对象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional类结合Lambda表达式和StreamAPI的使用,需要的朋友可以参考下
    2024-10-10

最新评论