导航
导航

redis的incr操作遇到的异常

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序列化操作,所以第一种方式排除。