因在缓存对象中增加字段,导致Redis出现反序列化失败的问题

因在缓存对象中增加字段,导致Redis出现反序列化失败的问题,第1张

因为业务需求的需要,我们需要在原来项目中的一个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的缓存。

我是 「翎野君」 ,感谢各位朋友的: 点赞 收藏 评论 ,我们下期见。

1.1 数据属性(`properties`),对象的普通属性将字符串名称映射到值。例如,下面对象obj有一个数据属性,名称为 prop,对应的值为 123:var obj = {prop: 123}可以用以下方式读取属性的值:console.log(obj.prop)// 123,console.log(obj["prop"])// 123,当然也可以用以下方式来设置属性的值:obj.prop = "abc"obj["prop"] = "abc"

1.2 访问器属性,另外,可以通过函数处理获取和设置属性值。 这些函数称为访问器函数。 处理获取的函数称为getter。 处理设置的函数称为setter:var obj = {get prop () {return 'Getter'},set prop (value) {console.log('Setter: ' + value)}}访问 obj 属性:>obj.prop'Getter'>obj.prop = 123Setter: 123。

1.3 内部属性一些属性只是用于规范,这些属于“内部”的属性,因为它们不能直接访问,但是它们确实影响对象的行为。内部属性有特殊的名称都写在两个方括号,如:内部属性[[Prototype]]指向对象的原型。它可以通过Object.getPrototypeOf()读取。它的值只能通过创建具有给定原型的新对象来设置,例如通过object.create()或__proto__ 。

内部属性[[Extensible]]决定是否可以向对象添加属性。可以通过Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。可以通过Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。

属性特性(attribute),属性的所有状态,包括数据和元数据,都存储在特性(attribute)中。它们是属性具有的字段,就像对象具有属性一样。特性(attribute)键通常用双括号编写:

Microsoft Press(该链接可能指向英文页面)出版的Programming Applications for Microsoft Office Outlook 2007

购买该书籍(该链接可能指向英文页面)

BusinessCardView、

CalendarView、IconView和

TimelineView

BusinessCardView

对象显示的字段由与每个显示的 Outlook 项目相关联的电子名片 (EBC) 版式确定。

若要获取视图的ViewFields集合,需使用关联的View对象(如CardView或TableView对象)的ViewFields属性。

ViewFields集合的Add方法用于创建ViewField对象,该对象表示要在视图中显示的 Outlook 项目属性。

ColumnFormat

属性,可以更改各个列属性在视图中的显示方式。

在下面的代码示例中,

ModifyMeetingRequestsView获取TableView对象,该对象表示用户收件箱中作为“会议请求”视图的所有视图。然后,该示例使用Add方法将“开始”和“结束”字段添加到与TableView对象对应的ViewFields对象中。该示例还将“发件人”字段的标签更改为“组织者”。

ModifyMeetingRequestsView

然后保存修改后的TableView对象。

如果您使用 Microsoft Visual Studio 来测试该代码示例,在导入

Microsoft.Office.Interop.Outlook

命名空间时,必须先添加对 Microsoft Outlook 14.0 对象库组件的引用,并指定Outlook变量。

using Outlook = Microsoft.Office.Interop.Outlook

private void ModifyMeetingRequestsView(){Outlook.TableView tableView = null

Outlook.ViewField startField = null

Outlook.ViewField endField = null

Outlook.ViewField fromField = nulltry{tableView =

Application.Session.GetDefaultFolder(


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11741499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存