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

假如项目之间是通过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

扫描二维码关注公众号,回复: 4729471 查看本文章

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

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

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

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

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

在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/fenghuoliuxing990124/article/details/85105214
今日推荐