多模塊項(xiàng)目使用枚舉配置spring-cache緩存方案詳解
一、前言
- 近期被刷接口了,考慮增加 本地緩存提高性能,另配置 限流
- 使用 spring-cache 注解式緩存,可以提高使用緩存的開發(fā)效率
- 不同業(yè)務(wù),可以定制 自己的緩存策略,是基本需求
- 多模塊項(xiàng)目,最好在 統(tǒng)一的模塊(如 common) 加載緩存配置
二、方案
1. 配置緩存:接口 + 枚舉 + Lombok
緩存配置接口:
public interface ICacheConfig {
Integer getTtl();
}common模塊緩存配置(使用 Lombok 的 FieldNameConstants 自動(dòng)生成 常量):
@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 自動(dòng)生成的 常量:
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òng)生成 枚舉名稱常量,便于代碼 導(dǎo)航、重構(gòu)
- 通過 Reflections 庫,common模塊自動(dòng)加載 各模塊的緩存配置,SimpleCacheManager 組合 各種不同配置的 緩存(CaffeineCacheManager 不能),降低使用成本,提高可維護(hù)性
- sync = true,加鎖,只有一個(gè)線程去加載數(shù)據(jù),其他線程阻塞,防止 緩存擊穿
- alibaba/jetcache:支持TTL和兩級緩存、自動(dòng)刷新和加載保護(hù) 等
- netease-im/camellia:網(wǎng)易開源,有意思的是 支持基于注解執(zhí)行mget,mevict等批量操作
以上就是多模塊項(xiàng)目使用枚舉配置spring-cache緩存方案詳解的詳細(xì)內(nèi)容,更多關(guān)于枚舉配置spring cache緩存的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java動(dòng)態(tài)代理和AOP應(yīng)用示例
這篇文章主要介紹了Java動(dòng)態(tài)代理和AOP應(yīng)用,結(jié)合實(shí)例形式分析了java動(dòng)態(tài)代理在AOP面向切面編程中的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-07-07
使用postman傳遞list集合后臺springmvc接收
這篇文章主要介紹了使用postman傳遞list集合后臺springmvc接收的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot項(xiàng)目配置多個(gè)kafka的示例代碼
這篇文章主要介紹了springboot項(xiàng)目配置多個(gè)kafka,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
SpringBoot解決BigDecimal傳到前端后精度丟失問題
這篇文章將通過示例詳細(xì)為大家介紹SpringBoot如何解決BigDecimal傳到前端后精度丟失問題,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-06-06
RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求解析
這篇文章主要為大家介紹了RocketMQ?broker?消息投遞流程處理PULL_MESSAGE請求源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
利用java反射機(jī)制實(shí)現(xiàn)自動(dòng)調(diào)用類的簡單方法
下面小編就為大家?guī)硪黄胘ava反射機(jī)制實(shí)現(xiàn)自動(dòng)調(diào)用類的簡單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

