java - 如何在不覆盖默认 spring-cache 的情况下创建辅助 CacheManager
问题描述
我的 application.yml 中有一个默认的 redis 缓存配置:
cache:
type: redis
redis:
time-to-live: 7200000 # 2 hour TTL - Tune this if needed later
redis:
host: myHost
port: myPort
password: myPass
ssl: true
cluster:
nodes: clusterNodes
timeout: 10000
它工作得很好,我不想为它创建任何自定义缓存管理器。
但是,我的代码中有一些缓存不需要使用 redis。出于这个原因,我想制作第二个 CacheManager ,它是一个简单的 ConcurrentHashMap 并使用 @Cacheable 指定它
为此,我创建了一个新的 CacheManager Bean:
@Configuration
@EnableCaching
@Slf4j
class CachingConfiguration {
@Bean(name = "inMemoryCache")
public CacheManager inMemoryCache() {
SimpleCacheManager cache = new SimpleCacheManager();
cache.setCaches(Arrays.asList(new ConcurrentMapCache("CACHE"));
return cache;
}
}
这会导致 inMemoryCache 成为我的默认缓存,而我的所有其他 @Cacheable() 都尝试使用 inMemoryCache。我不希望我创建的 CacheManager bean 成为我的默认值。无论如何我可以指定它是次要的而不是阻止 spring-cache 发挥它的魔力吗?
谢谢!
解决方案
我能够从 yml 中保留默认的 Redis 配置,并使用以下代码添加一个新的 inMemory CacheManager(我使用的是 Clustered Redis):
@Bean
@Primary
public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration.usePrefix();
return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
.cacheDefaults(redisCacheConfiguration).build();
}
@Bean
public LettuceClusterConnection getConnection(LettuceConnectionFactory lettuceConnectionFactory) {
LettuceClusterConnection clusterConnection = (LettuceClusterConnection) lettuceConnectionFactory.getClusterConnection();
return clusterConnection;
}
@Bean(name = "inMemoryCache")
public CaffeineCacheManager inMemoryCache() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(caffeineCacheBuilder());
return cacheManager;
}
Caffeine< Object, Object > caffeineCacheBuilder() {
return Caffeine.newBuilder()
.initialCapacity(3000)
.maximumSize(40000)
.expireAfterAccess(30, TimeUnit.MINUTES);
}
推荐阅读
- angular - 所有图像都在错误的路径控制台错误
- c# - C# - 不变的文化
- ios - 使用 WKWebView 的活动指示器不会消失
- java - 从 6.0.5 升级到 6.2 后的 Liferay 编码
- javascript - javascript:未捕获的引用错误
- java - 添加网站不同子目录的不同意图
- java - 流启动后 Spark Stream 新作业
- php - 无法更改 Travis-CI PHP memory_limit
- yaml - 带括号的 Homestead.yaml 格式目录路径
- angular - 在收到 HTTP Post 的响应之前,如何阻止循环继续?(离子 3)