项目上要用统计一个业务动作每天的执行次数,设计上就是存储在redis中。 但是初始化第一次执行后却无法再继续统计,每次报redis的序列化失败,手动去reids上查看key的存储情况,发现存储的value实际是一个序列化后的字符串。
redis的incr自增操作必须要保证存储的value是数字或者数字的字符串形式,如果是序列化后的数据则无法转换为数字(不知道反序列化方式)。
看到这个序列化就估摸着是redisTemplate的问题,看代码验证,由于统计第一次时使用的是 redisTemplate.opsForValue.setIfAbsent ( key, 1),而这个方法内部会对value做序列化。所以后面的incr都失败了。修改方案就是直接使用 redisTemplate.opsForValue.increment(key, 1) 来初始化第一次。
increment(key, 1) 不会对value序列化。