springboot 整合redis作为缓存,自定义json序列化对象,解决无构造函数报错。


原理: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.报错解决方式

 

 当我们创建实例化的时候应该添加上一个无参构造函数

 多次查询缓存数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值