如何通过Spring Boot禁用Redis缓存?

时间:2019-05-09 11:09:51

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

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

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

SimpleCacheManager

不幸的是,Redis无法做到这一点,因为它的 @Bean public Cache myCache() { return new CaffeineCache( "my-cache", Caffeine.newBuilder() .maximumSize(10) .build()); } 实现Cache不是公开的。

我们想做的另一件事是定义一个豆RedisCache,例如使用咖啡因

CacheManagerCustomizer<?>

同样,Redis无法做到这一点,因为 @Bean public CacheManagerCustomizer<CaffeineCacheManager> caffeineCacheManager() { return cacheManager -> cacheManager .setCaffeine(Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.MINUTES)); } 不可变的

因此,目前唯一的解决方案是创建我们自己的RedisCacheManager,但这会阻止使用RedisCacheManager

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

2 个答案:

答案 0 :(得分:1)

我需要从 spring.cache.type 属性启用/禁用 Redis 自动配置。下面的代码解决了我的问题。这可能有助于仅通过更改单个属性来禁用/启用 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"
    }
  }
}

答案 1 :(得分:0)

排除@SpringBootApplication批注的属性,类似于:@SpringBootApplication( exclude = { RedisAutoConfiguration.class } )

和 设置:spring.data.redis.repositories.enabled=false