spring - 如何使用 Spring Boot 禁用 Redis 缓存?

标签 spring spring-boot spring-test spring-data-redis spring-cache

使用 Spring Boot 2.1,我在配置文件中定义了一个 RedisCacheManager bean,使用 Java 配置。一切正常,但我有时希望禁用它,例如在测试中。 Spring Boot 提供了 spring.cache.type=NONE禁用缓存,按照此 documentation .但是,这个属性将不起作用,因为我已经定义了一个 CacheManager,因此 Spring Boot 不会配置我想要的 NoOpCacheManager(在 @ConditionalOnMissingBean(CacheManager.class) 上有一个 NoOpCacheConfiguration,它的优先级低于 RedisCacheConfiguration)。

在定义缓存时,无论提供者是什么(例如 Caffeine),我们通常将它们定义为 bean,然后由 Spring Boot 的自动配置解析为 SimpleCacheManager .
例如

    @Bean
    public Cache myCache() {
        return new CaffeineCache(
                "my-cache",
                Caffeine.newBuilder()
                        .maximumSize(10)
                        .build());
    }

不幸的是,这在 Redis 中是不可能的,因为它的 Cache实现,RedisCache ,不公开。

我们喜欢做的另一件事是定义一个 bean CacheManagerCustomizer<?> ,例如咖啡因
    @Bean
    public CacheManagerCustomizer<CaffeineCacheManager> caffeineCacheManager() {
        return cacheManager -> cacheManager
                .setCaffeine(Caffeine.newBuilder()
                        .expireAfterWrite(1, TimeUnit.MINUTES));
    }

同样,这在 Redis 中是不可能的,如 RedisCacheManager不可变 .

所以现在唯一的解决方案是创建我们自己的 RedisCacheManager,但这会阻止 spring.cache.type: NONE 的使用。 .

所以这是我的问题。使用 Spring Boot 配置 Redis 缓存以便我们可以根据需要禁用它的最佳方法是什么?

最佳答案

我需要从 spring.cache.type 启用/禁用 Redis 自动配置属性(property)。下面的代码解决了我的问题。这可能有助于任何想要通过更改单个属性来禁用/启用 redis 的人,在我的情况下是 spring.cache.type=redis .以下是主要配置。

@SpringBootApplication(exclude = {RedisAutoConfiguration.class})
public class SpringBootApp extends SpringBootServletInitializer {

}
@ConditionalOnProperty(prefix = "spring", name = "cache.type", havingValue = "redis")
@Configuration
@Import({ RedisAutoConfiguration.class })
public class ApplicationRedisConfig {

}
application.yaml 启用自动配置
spring:
  cache:
    type: redis
  redis.host: redis
当 redis 不可用时,健康检查会给出以下响应,这表明已包含自动配置。
{
  "status": "DOWN",
  "details": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 486730272768,
        "free": 216405499904,
        "threshold": 10485760
      }
    },
    "db": {
      "status": "UP",
      "details": {
        "database": "PostgreSQL",
        "hello": 1
      }
    },
    "elasticsearch": {
      "status": "UP"
    },
    "redis": {
      "status": "DOWN",
      "details": {
        "error": "org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to redis:6379"
      }
    }
  }
}
application.yaml 禁用自动配置
spring:
  cache:
    type: simple
  redis.host: redis
运行状况检查给出以下响应,表明 redis 已从自动配置中排除。
{
  "status": "UP",
  "details": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 486730272768,
        "free": 215928782848,
        "threshold": 10485760
      }
    },
    "db": {
      "status": "UP",
      "details": {
        "database": "PostgreSQL",
        "hello": 1
      }
    },
    "elasticsearch": {
      "status": "UP"
    }
  }
}

关于spring - 如何使用 Spring Boot 禁用 Redis 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058077/

相关文章:

java - ThreadLocal 与 Tomcat

java - 在 Spring Junit 测试中使用不同的 Auth 模型

java - Spring @Autowire 许多 bean

spring-boot - Spring 启动 Artemis 嵌入式代理行为

spring - 在grails应用程序中使用Spring Security限制页面 View

java - 如何在 thymeleaf 中传递字符串中的参数

java - 以编程方式访问应用程序上下文和上下文位置

java - 使用 ContextConfiguration 注释时无法加载 ApplicationContext

css - 具有 Angular 应用程序静态内容行为的 Spring Boot MVC?

java - 如何运行gulp任务和spring-boot :run together with maven?