因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题
背景描述
因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B、C、D引用到)。但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧。
升级缓存版本号
我们的正式环境和预发布环境是共用Redis和Mysql。如果修改了DTO且没有加@JsonIgnoreProperties(ignoreUnknown = true)这个注解。
那么DTO所在的A项目发到预发布之后,会启动一个后台定时任务把最新的DTO对象刷新到缓存中去,但是除了这个工程以外的其他依赖服务如果没有发的话,那么他们jar包里面的domain还是旧的DTO。
那么这个时候取出来的缓存(最新的DTO的缓存)就会有反序列化的错误,发包的延迟和预发布验证的时间都会导致线上反序列化失败,从而阻塞业务。
解决方案就是升级缓存的版本号(修改原来缓存DTO的Redis的Key值)
缓存key升级版本号,在其他未更新的应用中的缓存key已经在跑的jar包里面,他们的key是旧的,比如v1,那么v1对应的DTO就是旧的DTO。
升级后新的DTO版本为v2那么发起来的自身服务刷新最新的DTO缓存是放到v2的key里面的,即v2->新的DTO,v1->旧的DTO。这样可以保证不会有反序列化的问题。
注意
改版本号一定要在第一次发的时候改上去才好,不然你按v1发的版,发现问题再改成v2已经就晚了,因为已经把新的DTO刷到v1里面了,线上的依赖服务里面的domain包就是v1捞出来肯定异常。
如果发生这种情况只能再发v2版本到预发布,同时删掉线上v1的缓存。
如果对您有帮助,请不要忘了给翎野君点赞。
因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题的更多相关文章
- 多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中【我】
多线程查询数据,将结果存入到redis中,最后批量从redis中取数据批量插入数据库中 package com.xxx.xx.reve.service; import java.util.ArrayL ...
- 在oracle表中增加字段,并调整字段的顺序
增加字段的语句很简单,以用户身份连接oracle服务: alter table tablename add(colname coltype); # 填上表名.字段名.字段类型 修改字段顺序前,查看表中 ...
- 不规范的json文档 转化成 java 对象的处理
最近练习爬取数据,遇到了json文档中属性名称没有用双引号的情况,内容如下: 标准的json文档,属性名称都是带双引号的 最后写了个方法,替换属性名字 为 两头追加双引号的属性名字, 特别要注意,防止 ...
- 缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】
缓存有效期与淘汰策略 有效期 TTL (Time to live) 设置有效期的作用: 节省空间 做到数据弱一致性,有效期失效后,可以保证数据的一致性 Redis的过期策略 过期策略通常有以下三种: ...
- DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)
为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791).因为不同的视频压缩 ...
- 如何使用 t-sql 更新数据库中日期字段的部分数据(年?月?日?时?分?秒?)
嗯,从网上找到了一些内容,综合利用了sql server的一些内置方法 首先是 convert 方法:https://msdn.microsoft.com/zh-cn/library/ms187928 ...
- [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...
- ASP.NET MVC5 之 AspNetUsers 表增加字段
MVC5 执行数据库迁移时,会生成一些默认的数据表,但是在实际的工作中.若用到的时候,难免要增添一些字段. 1.AspNetUsers 增加字段 A.打开MVC中的 IdentityModels.cs ...
- (转)Hibernate框架基础——在Hibernate中java对象的状态
http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...
随机推荐
- vue 异步渲染
<!DOCTYPE html> <html> <head> <title> hello world vue </title> <met ...
- Gitlab创建一个项目(三)使用IntelliJ IDEA开发项目
Gitlab创建一个项目 Gitlab创建一个项目(二)创建新用户以及分配项目 1.登陆到gitlab 2.点击项目名,获取http的URL 3.idea打开,选择git 4.设置项目路径以及本地保存 ...
- Centos7搭建Harbor私有仓库(二)
1 说明 前文Centos7搭建Harbor私有仓库(一)中成功搭建了Harbor,但,是以http方式搭建的,这里我们修改为https方式 以下基于镜像CentOS-7-x86_64-Minimal ...
- 树莓派配置wifi网络+更换镜像源
刚安装完系统后,采用的是树莓派通过网线连接笔记本wifi共享方式联网,后面考虑不使用网线,让树莓派使用wifi联网. 一.配置无线网络 1.通过ssh登录树莓派,输入用户名和密码后,输入如下命令进入图 ...
- 团队项目-Beta冲刺
请大家在每次作业开头添加格式描述: 这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 <写上团队名称>(附上团队博客链接) 这 ...
- header中Content-Disposition的作用与使用方法
下载文件的时候会使用: Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用 ...
- php string常用函数
<?php $a[]='a'; $a[]='b'; $a[]='C'; echo "</br>"; /* implode — 将一个一维数组的值转化为字符串 说明 ...
- JavaWeb报错:java.sql.SQLException: Invalid value for getInt()
1.错误描述:在对数据库进行操作时,控制台报错:java.sql.SQLException: Invalid value for getInt() :2.错误原因:数据库中表的字段的类型与实体类中属性 ...
- VMware共享本地文件
最后可以在这里找到
- Array.Sort(valuesArry);
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...