以下是关于 Spring自定义缓存管理器 的详细说明,包含两种实现方式的对比和代码示例,并附表格总结:
1. 自定义缓存管理器的两种方法
方法1:通过配置文件调整RedisCacheManager
适用场景 :简单配置,如修改键前缀、超时时间等。
原理 :基于Spring Boot的自动配置,通过修改application.properties
参数实现。
方法2:完全自定义代码创建RedisCacheManager
适用场景 :复杂自定义(如自定义序列化器、多级缓存、动态配置等)。
原理 :通过@Bean
显式创建RedisCacheManager
实例,完全控制配置。
2. 方法1:通过配置文件消除键前缀并设置超时时间
步骤
- 禁用键前缀 :设置
spring.cache.redis.key-prefix=
为空。 - 设置全局超时时间 :通过
spring.cache.redis.time-to-live
配置。
配置示例
properties
# application.properties
spring.cache.type=redis
spring.cache.redis.key-prefix= # 禁用前缀
spring.cache.redis.time-to-live=1800000 # 全局超时时间:30分钟
效果
- 缓存键无前缀(如直接使用
user:1001
)。 - 所有缓存项默认过期时间为30分钟。
3. 方法2:完全自定义代码创建RedisCacheManager
步骤
- 创建配置类 :通过
@Bean
定义RedisCacheManager
。 - 配置序列化器、超时时间等 :使用
RedisCacheConfiguration
。
代码示例
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.*;
import java.time.Duration;
@Configuration
public class RedisConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 1. 定义缓存配置
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 键序列化为字符串
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // 值序列化为JSON
.entryTtl(Duration.ofMinutes(30)); // 默认超时时间30分钟
// 2. 禁用键前缀
config = config.prefixCacheNameWithFalse(); // 关键代码:禁用前缀
// 3. 创建RedisCacheManager
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
}
}
关键点
- 禁用前缀 :
prefixCacheNameWithFalse()
。 - 自定义序列化 :如
StringRedisSerializer
和GenericJackson2JsonRedisSerializer
。 - 动态配置 :可为不同缓存设置不同的超时时间(如通过
RedisCacheWriter
)。
4. 对比表格
方法 | 适用场景 | 配置方式 | 代码示例片段 | 是否支持复杂自定义 |
---|---|---|---|---|
配置文件调整 | 简单配置(前缀、超时) | 修改application.properties |
spring.cache.redis.key-prefix= |
否 |
自定义代码 | 复杂配置(序列化、多级缓存) | 通过@Bean 显式创建RedisCacheManager |
RedisCacheConfiguration config = ... |
是 |
5. 关键配置参数说明
方法1(配置文件)
参数 | 描述 | 示例值 |
---|---|---|
spring.cache.redis.key-prefix |
缓存键的全局前缀(设为空禁用) | "" (禁用前缀) |
spring.cache.redis.time-to-live |
全局缓存过期时间(毫秒) | 1800000 (30分钟) |
方法2(代码配置)
参数 | 描述 | 示例值 |
---|---|---|
serializeKeysWith() |
自定义键的序列化方式 | StringRedisSerializer |
serializeValuesWith() |
自定义值的序列化方式 | GenericJackson2JsonRedisSerializer |
entryTtl() |
设置默认超时时间 | Duration.ofMinutes(30) |
prefixCacheNameWith() |
启用/禁用缓存名称作为前缀(如prefixCacheNameWithFalse() 禁用) |
prefixCacheNameWithFalse() |
6. 注意事项
-
方法1的局限性:
- 仅能通过有限的配置参数调整(如前缀、超时),无法自定义序列化器或复杂逻辑。
- 全局配置可能覆盖单个缓存的自定义设置。
-
方法2的优势:
- 完全控制配置(如多级缓存、动态超时)。
- 需要依赖注入
RedisConnectionFactory
或RedisTemplate
。
-
禁用键前缀的注意事项:
- 确保缓存键唯一,避免不同业务的键冲突。
- 若需多级缓存,可通过
cacheManager(builder -> builder.withCacheConfiguration(...))
为不同缓存命名空间设置前缀。
7. 完整代码示例(方法2)
java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
// 1. 定义默认配置
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))
.serializeKeysWith(SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
.prefixCacheNameWithFalse(); // 禁用前缀
// 2. 为特定缓存设置不同配置(可选)
config = config.disableCachingNullValues(); // 禁止缓存空值
// 3. 创建缓存管理器
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
总结
通过上述两种方法,可以灵活控制Redis缓存管理器的配置。对于简单需求,优先使用配置文件调整;对于复杂场景(如自定义序列化、多级缓存),推荐通过代码完全自定义。