1、问题
问题描述:
最近工作中遇到这样一个问题:将两个系统中某个缓存的值设置为通用的。(这里使用key=test表示)
原系统结构如下图:
![](https://img.haomeiwen.com/i3408605/7f129744a4605586.png)
说明:这里的Vo1和Vo2虽是不同类,但是类中的属性业务含义相同。(不然问题本身就没意义)
要求:
要求不能修改之前系统的代码,将两个系统的缓存共用。
简单来说,就是当系统1设设置了test的值,系统2就可以直接读取。反向同理。
修改后的系统结构如下图:
![](https://img.haomeiwen.com/i3408605/7daf6d76b302de94.png)
问题:
根据上图可以看出,两个系统存放的value是经过序列化之后的。所以原来系统中取出redis的value是直接通过反序列化再直接进行类型强制转化的。系统的取值代码如下:
(Vo1)SerializeUtil.unserialize(jedis.get(key.getBytes()))//系统1为例,系统2同理
所以问题是:如果redis中get到的类型不是Vo1的序列化,则会在强制类型转换的时候报错。Vo2同理。
2、解决思路
将value定义为类3(Vo3),系统1和系统2存储时分别将Vo1和Vo2转换为Vo3。在读取的时候,通过不同的系统应用名定位系统,然后针对性的将Vo3转化为Vo1或Vo2.
转化代码如下:(其他代码略去)
JSON.parseObject(JSON.toJSONString(vo3),Class.forName("com.test.vo.Vo1"))
说明:先将vo3转为json String,然后通过Vo1的类路径+类名获取Vo1,最后通过JSON的parseObject方法将json String转为Vo1.
网友评论