暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

redis反序列化异常

Whoooops 2021-04-15
670

在项目中,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必须经过。

文章转载自Whoooops,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论