无法连接Redis时如何在SpringBoot中设置缓存回退?

问题描述 投票:0回答:1

有一个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

我想如果应用程序能够独立于缓存可用性工作(执行业务逻辑),这是合理的。

可能的解决方案是:

  1. 自定义实现(即处理 Redis 缓存周围错误的包装器)
  2. Spring中考虑Redis缓存服务健康状况的标准配置(如果有的话)

在 SpringBoot 中设置后备缓存的正确方法是什么?

spring spring-boot caching redis
1个回答
0
投票

您可以通过配置来解决这个问题。您可以设置一个配置属性,例如

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 的实际实现留给您(因为我不知道您想要如何配置它),但这是如何实现这一点的总体思路。

© www.soinside.com 2019 - 2024. All rights reserved.