基于高并发环境的缓存一致性问题解决方法技术

技术编号:27508429 阅读:16 留言:0更新日期:2021-03-02 18:36
本发明专利技术公开了一种基于高并发环境的缓存一致性问题解决方法,包括:配置事务和缓存的执行顺序;捕获缓存执行失败事件;获取缓存执行的相关参数;对捕获到的事件进行处理;结合需要删除缓存的缓存名和Key集合再通过相应的摘要算法,计算出特征值并赋值到补偿数据中,在删除缓存失败时被入队到补偿队列,等待时间唤醒后再次执行补偿,如果删除操作执行成功,则把补偿队列中的相同特征值的数据清除,当新增入队数据的时候,判断队列里面是否已经有相同特征值的数据;对可配置项进行配置;对关键节点进行抽象归纳,并expose出精炼易懂的接口;本发明专利技术可灵活解决项目开发中的缓存一致性问题。问题。问题。

【技术实现步骤摘要】
基于高并发环境的缓存一致性问题解决方法


[0001]本专利技术涉及Spring框架下的应用软件编程
,特别是一种基于高并发环境的缓存一致性问题解决方法。

技术介绍

[0002]在现代互联网应用程序中,由于庞大的用户基数,常常需要应对较高的任务并发,而数据存取往往需要大量的外存IO操作,过长的处理时延,大大限制了应用的并发数。缓存技术便应运而生,即在数据层和接入层之间引入缓存层,由于是直接对内存的操作,极大降低了对外存的IO频次,特别是对应读多写少的应用,甚至能将处理时延降低几倍乃至数百倍,如图1所示。但随着缓存的引入,又不得不面对新的问题,数据一致性问题。
[0003]业界常见的处理方法有删除缓存后更新数据源,或者更新数据源后删除缓存。在低并发系统中,这两种处理方法均能较好的工作,随着并发数的提高,问题就逐渐暴露了出来。就拿前者来说,假设有两个线程并发进入,A线程更新,B线程读取,A删除缓存成功后但更新数据源成功前B线程开始读取缓存,此时读取到的缓存为空,于是从数据源查询出数据并将结果放入缓存,此时A线程更新数据源成功,不一致的“脏”数据由此产生,只能靠缓存的键值过期,或者下次更新才能恢复。而后者相较于前者则是一个更优的解决方案,数据源更新前不论读取并发有多高,都不会穿透到数据层造成大量的IO阻塞,且因为缓存还没有删除数据也还未更新,不会取到不一致的“脏”数据。但是依然存在异常情况,即数据源的更新事务提交前,删除了缓存,或者更新事务提交后但缓存删除却失败了,在高并发环境下依然会很容易出现一致性问题,如图2所示。
[0004]这时就需要引入额外的方法,进行补偿或者施加限制,尽最大可能在最短的时间内实现缓存的最终一致性,甚至是个别特殊系统下的强一致性。

技术实现思路

[0005]为解决现有技术中存在的问题,本专利技术的目的是提供一种基于高并发环境的缓存一致性问题解决方法,可灵活解决项目开发中的缓存一致性问题。
[0006]为实现上述目的,本专利技术采用的技术方案是:一种基于高并发环境的缓存一致性问题解决方法,包括以下步骤:
[0007]步骤1、配置事务和缓存的执行顺序;
[0008]步骤2、捕获缓存执行失败事件;
[0009]步骤3、获取缓存执行的相关参数;
[0010]步骤4、对捕获到的事件进行处理:首先维护一个队列,其次对补偿事件进行wrap,植入失败时刻、重读次数属性,然后维护一个持久化线程池,对所有入队的事件进行异步持久化处理,补偿成功后则异步删除持久化的数据,每次队列初始化的时候从已持久化的数据源读取未补偿成功的数据;
[0011]步骤5、结合需要删除缓存的缓存名和Key集合再通过相应的摘要算法,计算出特
征值并赋值到补偿数据中,在删除缓存失败时被入队到补偿队列,等待时间唤醒后再次执行补偿,如果删除操作执行成功,则把补偿队列中的相同特征值的数据清除,当新增入队数据的时候,判断队列里面是否已经有相同特征值的数据;
[0012]步骤6、对可配置项进行配置,包括对缓存进行强一致性或最终一致性的配置、对队列进行配置以及对补偿唤醒的延迟算法进行配置;
[0013]步骤7、对关键节点进行抽象归纳,并expose出精炼易懂的接口。
[0014]作为本专利技术的进一步改进,在步骤1中,配置事务和缓存的执行顺序具体包括:通过观察开关注解Import的Configuration,找出order属性最终被赋值的bean,然后通过autowire的方式获得reference,进而对其相应的存储字段进行设定。
[0015]作为本专利技术的进一步改进,在步骤2中,通过Spring-Cache框架的原生模块CacheErrorHandler来捕获缓存执行失败事件。
[0016]作为本专利技术的进一步改进,在步骤5中,所述的摘要算法包括Hash算法、SHA算法或MD5算法。
[0017]本专利技术的有益效果是:
[0018]本专利技术封装完善,配置灵活,集成简单,极大提高了缓存数据和数据源数据保持一致性的概率,配合无限制的补偿机制,最终一致性理论上达到100%。
附图说明
[0019]图1为引入缓存原因分析示意图;
[0020]图2为现有缓存处理的现状及问题所在示意图;
[0021]图3为本专利技术实施例1中补偿事件的整体处理设计图;
[0022]图4为本专利技术实施例1中补偿数据的特征值计算示意图;
[0023]图5为本专利技术实施例1中补偿队列出入队时特征值作用示意图;
[0024]图6为本专利技术实施例1的框架配置流程示意图;
[0025]图7为本专利技术实施例1中补偿唤醒算法的次数与时长关系示意图;
[0026]图8为本专利技术实施例1的框架核心的UML类图。
具体实施方式
[0027]下面结合附图对本专利技术的实施例进行详细说明。
[0028]实施例1
[0029]一种基于高并发环境的缓存一致性问题解决方法,本实施例采用可配置的方式,配置是强一致性还是最终一致性,配置补偿点的持久化介质等等,使用编程式或声明式的编码方式,灵活解决项目开发中的缓存一致性问题。
[0030]本实施例是基于Spring环境,封装同时兼容声明式和编程式编码方式来优化处理缓存一致性问题的框架。其中声明式的方式有两个要点,一是声明式缓存注解和声明式事务注解的执行顺序调整,二是缓存注解执行失败的事件捕获以及相应参数的获取;声明式和编程式的方式均有一个共同的要点,就是被标记的补偿点,要有一个特征值,即同样的缓存操作,再次被调用并且成功后,需要把原同样操作的补偿数据从补偿队列中剔除,避免重复补偿。
[0031]接下来针对声明式方式进行展开,第一个就是要配置事务和缓存的执行顺序,首先如果采用默认的AOP顺序,则事务和缓存的顺序依赖于多种因素,是不可控的,所以必须显式的对其排序值进行设定。通过查阅Spring-Framework源码,不难发现这两个AOP Advisor的排序是来自开关注解配置的order属性,通过传递MetaData的方式进行获取。所以可以推出若干种设定方式,最直观的就是在使用开关注解EnableTransactionManagement、EnableCaching中直接配置order属性,为其赋予合适的顺序值;其次就是通过观察开关注解Import的Configuration,找出order属性最终被赋值的bean,然后通过autowire的方式获得reference,进而对其相应的存储字段进行设定;最后就是通过反射、AOP等方式Hook相应的调用句柄,中途实施拦截并修改。综上,除了第二种,其他的方式对使用者的侵入性都比较高,以及稳定性偏低(比如通过反射的方式,后续版本升级了,Field或Method定义变了,则可能导致Hook失效)等问题,故本实施例采用第二种方式对事物和缓存的顺序进行设定。第二个就是缓存执行失败的事件捕获,这个有两种实现方式,一种是通过try-catch语句块本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于高并发环境的缓存一致性问题解决方法,其特征在于,包括以下步骤:步骤1、配置事务和缓存的执行顺序;步骤2、捕获缓存执行失败事件;步骤3、获取缓存执行的相关参数;步骤4、对捕获到的事件进行处理:首先维护一个队列,其次对补偿事件进行wrap,植入失败时刻、重读次数属性,然后维护一个持久化线程池,对所有入队的事件进行异步持久化处理,补偿成功后则异步删除持久化的数据,每次队列初始化的时候从已持久化的数据源读取未补偿成功的数据;步骤5、结合需要删除缓存的缓存名和Key集合再通过相应的摘要算法,计算出特征值并赋值到补偿数据中,在删除缓存失败时被入队到补偿队列,等待时间唤醒后再次执行补偿,如果删除操作执行成功,则把补偿队列中的相同特征值的数据清除,当新增入队数据的时候,判断队列里面是否已经有相同特征值的数据;步骤6、对可配置项进行配置,包括对缓存进行强一致性或最终一致...

【专利技术属性】
技术研发人员:王浩
申请(专利权)人:四川长虹电器股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1