1. 程式人生 > >Redis:反序列化出錯原因以及簡單解決方案

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

Redis認為因為序列號不同,所以這兩個不是同一個東西,因此拒絕修改,就會報錯

可用的解決方法是:進入redis: flushdb 即可

但是如果在開發中,這樣的方法不可取

因為在開發中,對Domain類的修改很頻繁,所以反覆清除redis的資料庫不可取

最好的方案是:定死Domain的序列號,這樣Redis比較序列號就不會去比較之前生成的序列號了,而是比較固定的序列號

在這裡插入圖片描述

後期,等各項功能都經過測試後,效能趨於穩定的時候,可以採取動態生成的序列號