最近在学习在Springboot中用Redis做缓存,现在大部分使用SpringBoot2.x了,但大部分讲解视频都是在讲1.x中 RedisCacheManager 是如何配置的,关于在2.x中如何配置查阅了一些资料。
首先,在Springboot2.x中 RedisCacheManager 类的一些变化
在springboot2.x中,RedisCacheManager已经没有了单参数的构造方法,所以我们不能使用 RedisTemplate 作为参数构造 RedisCacheManager
在Springboot1.x中配置 RedisTemplate 和 RedisCacheManager 的模板为:
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Student> stuRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Student> template = new RedisTemplate<Object, Student>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Student> ser = new Jackson2JsonRedisSerializer<Student>(Student.class);
template.setDefaultSerializer(ser);
return template;
}
//CacheManagerCustomizers可以来定制缓存的一些规则
@Primary //将某个缓存管理器作为默认的
@Bean
public RedisCacheManager studentCacheManager(RedisTemplate<Object, Student> stuRedisTemplate){
RedisCacheManager cacheManager = new RedisCacheManager(stuRedisTemplate);
//key多了一个前缀
//使用前缀,默认会将CacheName作为key的前缀
cacheManager.setUsePrefix(true);
return cacheManager;
}
在2.0中可以用容器自动装配的RedisCacheManager,我们定义(过期)规则,对对象进行序列化操作等都可以配置上去,绑定上去即可:
下面是2.0中配置的一个Demo,主要是配置RedisCacheManager,设置数据过期时限,存入json格式数据,便于我们观察。
//过期时间1天
private Duration timeToLive = Duration.ofDays(1);
//redisTemplate模板提供给其他类对redis数据库进行操作
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
// 设置 CacheManger
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
//redis缓存配置
.entryTtl(this.timeToLive)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
.disableCachingNullValues();
//根据redis缓存配置和reid连接工厂生成redis缓存管理器
RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.transactionAware()
.build();
return redisCacheManager;
}
@Bean(name = "redisTemplate")
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
//redis键序列化使用StrngRedisSerializer
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
//redis值序列化使用json序列化器
private RedisSerializer<Object> valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
经过这样配置后,缓存在redis中的对象就变为Json格式的了