有一个SpringBoot(v2.2.7)应用程序,其中配置了Redis缓存
pom.xml 片段
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
当 Redis 服务启动并可用时,缓存将按预期工作:用
@Cacheable
注释的方法的结果将被缓存。不幸的是,当 Redis 服务不可用时,对可缓存方法的任何调用都会导致异常 RedisConnectionFailureException: Unable to connect to Redis
。
我想如果应用程序能够独立于缓存可用性工作(执行业务逻辑),这是合理的。
可能的解决方案是:
在 SpringBoot 中设置后备缓存的正确方法是什么?
您可以通过配置来解决这个问题。您可以设置一个配置属性,例如
application.yaml
application:
cacheManager:
inMemory: true
application-redis.yaml
application:
cacheManager:
redis: true
然后在您的配置中
@Configuration
class CacheManagerConfiguration {
@Bean
@ConditionalOnProperty("application.cacheManager.redis")
@Primary
public CacheManager cacheManager() {
// TODO construct RedisCacheManager instance
}
@Bean
@ConditionalOnProperty("application.cacheManager.inMemory")
@Primary
public CacheManager cacheManager() {
// TODO construct an in-memory CacheManager instance
}
}
然后,当您运行应用程序时,如果您在
redis
配置文件处于活动状态下运行,它将加载 RedisCacheManager
(如果不可用,则会正确失败),否则它将加载内存中缓存管理器。
这是一个粗略的例子。您可能需要做得更好,我已将这些 bean 的实际实现留给您(因为我不知道您想要如何配置它),但这是如何实现这一点的总体思路。