在项目中,mybatis里面集成redis模板。使用
Map<Object, Object> entries = redisGoodsService.entries(user_id);获取hash中的value时,出现反序列化异常错误。
错误描述:
首先我使用redis模板对购物车中的数据减一的操作,
redisTemplate.opsForHash().increment(key,field,stept);
减完之后再调用entires方法获取redis值后,出现了反序列化异常的错误。但是在第一次获取redis的值。并没有出现此问题。
在spring.xml中也配置了redis序列化,仍然有这个错误。查看spring源码中,有序列化的代码。

百度一下可能的原因:
by default,RedisTempate uses a JdkSerializationRedisSerializer,so if you
did a ‘set’ it would make your Long look something like this in Redis:
"\\xac\\xed\\x00\\xo5sr\\x00\\x0eejava.lang.Long;\\x8b\\xe4\\90\\xcc\\x8f#\\xdf\\x02"
IncrBy works because Redis always returns a Long from that operation ,so RedisTemplate does not attempt to deserialize the result.The result of “get” however,goes through the deserialization process,which expects a format like the
above.
you can solve this by using a difference value serializer on you RedisTemplate;
RedisTemplate.setValueSerializer(new GenericToStringSerializer
默认情况下,RedisTempate使用JdkSerializationRedisSerializer
在Redis里,你的长相是这样的吗
“\\xac\\xed\\x00\\xo5sr\\x00\\x0”eejava.lang.Long文件;\\x8b\\xe4\\90\\xcc\\x8f#\\xdf\\x02”
IncrBy之所以起作用是因为Redis总是从该操作返回Long,所以RedisTemplate不会尝试反序列化结果但是,“get”的结果经过反序列化过程,该过程需要类似上面。
您可以通过在模板上使用差分值序列化程序来解决这个问题;
RedisTemplate.setValueSerializer(新的通用系列化剂)
简单来说调用incr后得到 值不会出错是没有经过redistemplate的deserialize, 而get必须经过。




