Redis:反序列化出错原因以及简单解决方案

4 篇文章 0 订阅
1 篇文章 0 订阅

假如项目之间是通过RPC远程调用的,那么必然会涉及到序列化与反序列化

通常序列化的通用方案都是去继承一个实现了Serializable 接口的一个基类,比如下图:

在这里插入图片描述

然后让其他的Domain类去继承该基类即可:

在这里插入图片描述
假如:对应的数据要写到Redis中,则:

	//更新Redis中的缓存
	private List<Catalog> reloadRedis() {
		List<Catalog> catalogList;
		
		catalogList = catalogMapper.selectAll();
		//设置到Redis中
		redisTemplate.opsForValue().set(RedisConstants.CATALOG_ALL,catalogList);
		return catalogList;
	}

但是这样会出问题的

原因如下:

假如修改了上面的Domain类(解开注释)

在这里插入图片描述

那么由于序列号是一旦Domain被修改了就会自动生成一个新的序列号,并且会覆盖原序列号

那么一旦启动服务你就会看到各种报错,反正大多和Serializable 相关

原因是之前存在 Redis中的数据的序列号是X,而这会Domain类的序列号从X变成Y

Redis认为因为序列号不同,所以这两个不是同一个东西,因此拒绝修改,就会报错

可用的解决方法是:进入redis: flushdb 即可

但是如果在开发中,这样的方法不可取

因为在开发中,对Domain类的修改很频繁,所以反复清除redis的数据库不可取

最好的方案是:定死Domain的序列号,这样Redis比较序列号就不会去比较之前生成的序列号了,而是比较固定的序列号

在这里插入图片描述

后期,等各项功能都经过测试后,性能趋于稳定的时候,可以采取动态生成的序列号

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值