原理:CacheManager===Cache缓存组件来实际给缓存中存取数据
1)、引入redis的starter,容器中保存的是 RedisCacheManager
2)、RedisCacheManager 帮我们创建 RedisCache来作为缓存组件;RedisCache通过操作redis缓存数据
3.默认保存数据都是object,利用自带的序列化保存,我们需要将序列化保存为json
当我们引入redis的starter ,cacheManager变为RediscacheManager
创建默认的RediscacheManager操作redis的时候使用的是RedisTemplate<object,object>,
RedisTemplate<object,object>是使用默认的jdk序列化机制
4.springboot2之前的版本是通过以下的方式自定义序列化的机制
@Bean
public RedisTemplate<Object, Users>usersRedisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Users> template=new RedisTemplate<Object,Users>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Users> ser=new Jackson2JsonRedisSerializer<Users>(Users.class);
template.setDefaultSerializer(ser);
return template;
}
@Bean
public RedisCacheManager usersCacheManager(RedisTemplate<Object, Users> usersRedisTemplate ){
RedisCacheManager cacheManager=new RedisCacheManager(usersRedisTemplate);
cacheManager.setUsePrefix(true);
return cacheManager;
}
通过自定义好的RedisTemplate来替代RedisCacheManager中默认的RedisTemplate
5.但是在springboot2之后简化了自定义的方式如果我们要将对象数据的系列化替换为json的方式
可以使用以下的方式
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory factory){
RedisCacheConfiguration redisCacheConfiguration=//创建Redis的配置对象
RedisCacheConfiguration.defaultCacheConfig()//defaultCacheConfig()方法是用来整合Redis的
.entryTtl( Duration.ofHours(1) )//设置缓存的有效时间及自动更新策略,大家可以自行设置缓存的时间
.disableCachingNullValues()//禁用空值
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer( new GenericJackson2JsonRedisSerializer( ) ));
// 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
return RedisCacheManager.builder(factory).cacheDefaults( redisCacheConfiguration ).build();
}
直接对RedisCacheManger进行操作
1.项目准备
1.准备redis环境 -----------环境准备入口
项目准备源码
链接:https://pan.baidu.com/s/111ATEF8mQJV3HBPFBIL3Wg?pwd=77vv
提取码:77vv
2.创建自定义的序列化
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory factory){
RedisCacheConfiguration redisCacheConfiguration=//创建Redis的配置对象
RedisCacheConfiguration.defaultCacheConfig()//defaultCacheConfig()方法是用来整合Redis的
.entryTtl( Duration.ofHours(1) )//设置缓存的有效时间及自动更新策略,大家可以自行设置缓存的时间
.disableCachingNullValues()//禁用空值
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer( new GenericJackson2JsonRedisSerializer( ) ));
// 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值
return RedisCacheManager.builder(factory).cacheDefaults( redisCacheConfiguration ).build();
}
3.创建查询方法并且标记缓存注解
@Autowired
TopicMapper topicMapper;
@Cacheable(cacheNames = "topic")
public Topic getTopicById(int id){
System.out.println("查询"+id+"新闻类型");
Topic topic=topicMapper.getTopicById(id);
return topic;
}
这里我们创建的缓存组件是“topic”其他操作基本相同 具体参考源码
4.测试
第一次查询会调用方法
序列化机制启用。
对比不用序列化机制
第二次查询相同的数据出现报错
5.报错解决方式
当我们创建实例化的时候应该添加上一个无参构造函数
多次查询缓存数据