七 SpringBoot - Redis 缓存( 三 )

2.3.4 修改值 (出现错误)//程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存,存在问题//场景:对班级人数进行增减操作,比如将班级人数,增加10log.info("------ 基于SpringBoot框架自动配置的redisTemplate 操作数据 ------");redisTemplate.opsForValue().increment("student_num",10);//直接报错,会报500异常: redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range//原因,通过系统默认的 redisTemplate,存放key和value值时,会自动使用Object类的序列化和反序列化,导致redis中真实存放的数据不是原始值,而是序列化后的值数据结果:

七 SpringBoot - Redis 缓存

文章插图
2.4 自定义redisTemplate2.4.1 fastjson 依赖<dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.62</version></dependency>2.4.2  自定义redisTemplate 配置类//Redis自定义配置类,实现一个自定义序列化方式的 redisTemplate,提缓缓掉默认自动配置的 redisTemplate,实现String类型任意类型的value@Configurationpublic class RedisConfig {    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        // 自定义redisTemplate的模板对象        RedisTemplate<String, Object> template = new RedisTemplate<>();        // 设置连接工厂        template.setConnectionFactory(redisConnectionFactory);        //由于要通过程序操作远程的redis数据库,必须支持序列化,才可以让程序中的数据,在网络中传输        //定义String类型的序列化方式        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 定义fastjson序列化方式,可以序列化任何对象        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);        // 需改为新的序列化方式        template.setKeySerializer(stringRedisSerializer);        template.setValueSerializer(fastJsonRedisSerializer);        template.setHashKeySerializer(stringRedisSerializer);        template.setHashValueSerializer(fastJsonRedisSerializer);        // 初始化为新的模板        template.afterPropertiesSet();        return template;    }}2.4.3 使用自定义redisTemplate 重新操作数据//自动装配自定义 redisTemplate@Autowiredprivate RedisTemplate<String,Object> redisTemplate;//其他代码不变操作结果:
七 SpringBoot - Redis 缓存

文章插图
2.5 自定义redisUtils工具类2.5.1 自定义redisUtils工具类--->RedisUtil 工具类
2.5.2 使用自定义redisTemplate和redisUtils工具类@GetMapping("/testRedisUtils")public String testSpringBootRedisUtils(){    //基于自定义的redisTemplate 和 RedisUtils 工具类,操作redis缓存    //程序中,添加数据据到redis    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 添加数据 ------");    redisUtils.set("kh96_class_name_utils","KGC_KH96");    redisUtils.set("student_num_utils",19);    //程序中,从redis获取数据    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 获取数据 ------");    log.info("****** 根据 班级的key:{},获取班级名称:{} ******","kh96_class_name_utils",redisUtils.get("kh96_class_name_utils"));    log.info("****** 根据 班级的key:{},获取班级人数:{} ******","student_num_utils",redisUtils.get("student_num_utils"));    //程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存    //场景:对班级人数进行增减操作,比如姜班级人数,增加10    log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 操作数据 ------");    redisUtils.incr("student_num_utils",10);    return "工具类 RedisUtils  操作 redis 成功!";}

经验总结扩展阅读