Redis:反序列化出錯原因以及簡單解決方案
阿新 • • 發佈:2019-01-01
假如專案之間是通過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比較序列號就不會去比較之前生成的序列號了,而是比較固定的序列號
後期,等各項功能都經過測試後,效能趨於穩定的時候,可以採取動態生成的序列號