多模塊項目使用枚舉配置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 不能),降低使用成本,提高可維護(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)文章
使用postman傳遞list集合后臺springmvc接收
這篇文章主要介紹了使用postman傳遞list集合后臺springmvc接收的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot解決BigDecimal傳到前端后精度丟失問題
這篇文章將通過示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-06-06RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求解析
這篇文章主要為大家介紹了RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04利用java反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法
下面小編就為大家?guī)硪黄胘ava反射機(jī)制實(shí)現(xiàn)自動調(diào)用類的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08