spring - 如何使用 Spring Boot 禁用 Redis 缓存?
问题描述
使用 Spring Boot 2.1,我在配置文件中使用 Java 配置定义了一个 RedisCacheManager bean。一切正常,但有时我想禁用它,例如在测试中。spring.cache.type=NONE
根据本文档, Spring Boot 提供了禁用缓存的功能。但是,这个属性将不起作用,因为我已经定义了一个 CacheManager,因此 Spring Boot 不会配置我想要的 NoOpCacheManager(有一个@ConditionalOnMissingBean(CacheManager.class)
on NoOpCacheConfiguration
which 的优先级低于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<?>
,例如使用 Caffeine
@Bean
public CacheManagerCustomizer<CaffeineCacheManager> caffeineCacheManager() {
return cacheManager -> cacheManager
.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES));
}
RedisCacheManager
同样,这对于 Redis 来说是不可能的,因为immutable也是如此。
所以目前唯一的解决方案是创建我们自己的 RedisCacheManager,但这会阻止spring.cache.type: NONE
.
所以这是我的问题。使用 Spring Boot 配置 Redis 缓存以便我们可以根据需要禁用它的最佳方法是什么?
解决方案
我需要从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"
}
}
}
推荐阅读
- python - 字典到列表,其中键重复值的次数
- docker - Docker 检查包含 ip 更改后的旧 ip 地址
- matlab - 关于 Psychtoolbox 的画面功能错误
- angular - Angular 中的 Subject 和 Observable
- sql - SELECT 多次相同的列返回重复
- http - 如何在 http 上设置 2 个 Web 应用程序
- windows-server-2012-r2 - Zabbix active agent 无法连接到 Zabbix server - 连接被远程主机强行关闭
- android - Android图像复制破坏了原始文件
- excel - 将文件名中的日期提取到单元格中
- selenium-webdriver - IntellIJ 无法使用 FindBy(XPATH) 获取 webelement