一种保证缓存与数据库数据一致的方法技术

技术编号:23852040 阅读:28 留言:0更新日期:2020-04-18 09:09
本发明专利技术公开了一种保证缓存与数据库数据一致的方法,包括如下步骤:应用程序通过API接口将数据写入数据库;将对数据库的执行操作异步写入二进制日志文件binlog;通过从二进制日志文件binlog读取日志后更新缓存;应用程序通过API接口从缓存中读取数据。本发明专利技术通过采用二进制日志文件binlog结合异步Asynchronous更新缓存,可以保证缓存与数据库数据一致。

A method to ensure the consistency between cache and database data

【技术实现步骤摘要】
一种保证缓存与数据库数据一致的方法
本专利技术涉及数据库在高并发的系统中的数据处理
,尤其是一种保证缓存与数据库数据一致的方法。
技术介绍
在高并发的系统中关于缓存的重要性不言而喻,缓存在项目当中大量使用,扛住了大部分的查询流量,但也有很多点需要注意,最为典型的例子就是数据一致性问题,缓存击穿问题,缓存高可用问题等等。关于数据一致性的问题:缓存一致性就是说DB的数据与缓存的数据保持一致,理论上同一瞬间去变更两个值是最理想的,访问缓存跟DB是一致的。在分布式的情况下,无论如何操作,更新DB与缓存是存在间隙的。并且在结合实际情况下的多线程环境,那问题将更加复杂。更新缓存的策略:先更新DB再更新缓存,此方案线程T1更新数据库数据D1->D2,还没更新缓存,线程T2更新数据D2->D3,由于线程T2可能比较快,直接更新缓存为D2,此时运行“缓慢”的T1才更新缓存为D2。结果为DB的数据为D3,缓存的数据为D2。先更新缓存再更新DB,线程T1更新完缓存还没更新DB,线程T2很快更新完缓存立马T2更新DB为D2,这个时候T1才更新DB为D1,数据库为D1,缓存为D2。
技术实现思路
本专利技术所要解决的技术问题是:针对在高并发的系统中缓存与数据库数据不一致的问题,提供一种保证缓存与数据库数据一致的方法。本专利技术采用的技术方案如下:一种保证缓存与数据库数据一致的方法,其特征在于,包括如下步骤:应用程序通过API接口将数据写入数据库;将对数据库的执行操作异步写入二进制日志文件binlog;通过从二进制日志文件binlog读取日志后更新缓存;应用程序通过API接口从缓存中读取数据。其中,在应用程序通过API接口将数据写入数据库前先淘汰缓存。其中,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁。其中,通过设置一个小于缓存过期时间的超时值,使所述互斥锁提前使用。其中,当缓存过期时通过异步线程进行缓存的构建。其中,若对脏数据保证缓存与数据库数据一致时,在应用程序通过API接口将数据写入数据库后再淘汰缓存。其中,所述数据库在更新和读取的地方使用同样key的分布式锁。其中,通过从二进制日志文件binlog读取日志后更新缓存的方法为:在读取的日志中扫描二进制日志文件binlog的修改记录,根据扫描出的修改记录去更新缓存。其中,应用程序通过API接口从缓存中读取数据的方法为:为缓存中每条库存记录配置一个递增的版本号,每次应用程序通过API接口从缓存中读取数据时,比较消息的版本号与当前缓存的版本号的大小,将小于消息的版本号的数据丢弃。其中,采用LRU算法策略处理缓存溢出,并采用Redis的RDB和AOF持久化策略处理缓存数据丢失。综上所述,由于采用了上述技术方案,本专利技术的有益效果是:本专利技术通过采用二进制日志文件binlog结合异步Asynchronous更新缓存,可以保证缓存与数据库数据一致。附图说明为了更清楚地说明本专利技术实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本专利技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。图1为本专利技术的保证缓存与数据库数据一致的方法的原理框图。具体实施方式为了使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本专利技术进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本专利技术,并不用于限定本专利技术,即所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本专利技术实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本专利技术的实施例的详细描述并非旨在限制要求保护的本专利技术的范围,而是仅仅表示本专利技术的选定实施例。基于本专利技术的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。二进制日志文件binlog主要用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复等等操作的用途,另外还可以应用在一些其他的场景,缓存就是其中的一个场景,可以用来异步做很多解耦的事情。由此,本专利技术采用二进制日志文件binlog结合异步Asynchronous更新缓存,来解决在高并发系统中缓存与数据库数据的一致性问题。以下结合实施例对本专利技术的特征和性能作进一步的详细描述。实施例1如图1所示,本实施例提供的一种保证缓存与数据库数据一致的方法,包括如下步骤:应用程序通过API接口将数据写入数据库;将对数据库的执行操作异步写入二进制日志文件binlog;通过从二进制日志文件binlog读取日志后更新缓存;应用程序通过API接口从缓存中读取数据。其中,应用程序通过API接口将数据写入数据库时,可以采用JDBC将数据源的数据写入数据库。其中,更新缓存时,修改缓存很直接,但是涉及到本次更新的数据结果需要一堆数据运算,复杂度就增加了。而淘汰缓存仅仅会增加一次cachemiss,代价可以忽略,所以优选淘汰缓存。若先写入数据库后淘汰缓存,如果淘汰失败,缓存里会一直是脏数据;若先淘汰缓存后写入数据库,下次请求的时候缓存就会misshit一次,这个代价是可以忽略的(如果淘汰失败returnfalse),综合比较统,推荐先淘汰缓存再写数据库。由此,在本专利技术中,在应用程序通过API接口将数据写入数据库前先淘汰缓存。其中,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁,通过这样的方式,在缓存过期时等待一定的时间后就可以从缓存中继续获取数据。具体地,当缓存过期时,不是立即去加载数据库(loaddb),而是先使用缓存工具的某些成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去建立一个互斥锁,当操作返回成功时,再进行加载数据库(loaddb)的操作并回设缓存;否则就重试整个获取缓存值的方法。该过程的代码表达如下:进一步,通过设置一个小于缓存过期时间(memcachetimeout)的超时值,使所述互斥锁提前使用。具体地,在缓存值内部设置一个超时值(timeout1),超时值(timeout1)比实际的缓存过期时间(timeout2)小;当从缓存读取到超时值(timeout1)发现它已经过期时候,立即延长超时值(timeout1)并重新设置到缓存;然后再从数据库加载数据并设置到缓存中。该过程的代码表达如下:对于缓存过期的处理,从redis上看,没有设置过期时间,这就保证了不会出现缓存的热点key过期问题,也就是“物理”不过期。从功能上看,如果缓存不过期,那就成静态的了,所以我们把缓存过期时间存本文档来自技高网...

【技术保护点】
1.一种保证缓存与数据库数据一致的方法,其特征在于,包括如下步骤:/n应用程序通过API接口将数据写入数据库;/n将对数据库的执行操作异步写入二进制日志文件binlog;/n通过从二进制日志文件binlog读取日志后更新缓存;/n应用程序通过API接口从缓存中读取数据。/n

【技术特征摘要】
1.一种保证缓存与数据库数据一致的方法,其特征在于,包括如下步骤:
应用程序通过API接口将数据写入数据库;
将对数据库的执行操作异步写入二进制日志文件binlog;
通过从二进制日志文件binlog读取日志后更新缓存;
应用程序通过API接口从缓存中读取数据。


2.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,在应用程序通过API接口将数据写入数据库前先淘汰缓存。


3.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,当缓存过期时建立互斥锁,在更新缓存后再释放互斥锁。


4.根据权利要求3所述的保证缓存与数据库数据一致的方法,其特征在于,通过设置一个小于缓存过期时间的超时值,使所述互斥锁提前使用。


5.根据权利要求4所述的保证缓存与数据库数据一致的方法,其特征在于,当缓存过期时通过异步线程进行缓存的构建。


6.根据权利要求1所述的保证缓存与数据库数据一致的方法,其特征在于,若对脏数据保...

【专利技术属性】
技术研发人员:施甘图庭治宏徐韬
申请(专利权)人:拉货宝网络科技有限责任公司成都市赛力培物流科技有限公司
类型:发明
国别省市:四川;51

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

1