2个独立的项目,一个springboot搭建的项目 redis的incr操作,另一个spring搭建的项目redis的get操作,对同一个redis进去操作。
现有一个incr的key , 当调用incr后返回值一切正常, 当对此key进行get调用的时候出现了如下的异常
Cannot deserialize
起初以为是get查询序列化的原因。
默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略
redis中StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。而RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
就是因为序列化策略的不同,即使是同一个key用不同的Template去序列化,结果是不同的。所以根据key去删除数据的时候就出现了删除失败的问题
当时以为问题出在此,spring的项目历史久远,改动的是springboot项目的redis配置。配置一致后发现问题依旧,就很纳闷了,,后面网上查阅资料才知道
incr后得到 值不会出错是没有经过redistemplate的deserialize, 而get必须经过 所以只要设置redistemplate的ValueSerializer即可
当值采用Jdk序列化操作后,使用get获取失败。这是redis的一个bug
有两种解决办法。
第一,采用StringRedisSerializer序列化其值。
配置中添加
第二,采用boundValueOps(key).get(0,-1)获取计数key的值
spring项目中已经很多原始数据是通过jdk序列化操作,所以第一种方式排除。
- 本文标题: redis的incr操作遇到的异常
- 文章作者: sherryriver(木木三可)
- 发布时间: 2019.04.16
- 本文链接: https://sherryriver.github.io/2019/04/16/redis的incr操作遇到的异常/
- 许可协议: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。