一种实现缓存数据和数据库数据一致的方法与流程

文档序号:33161341发布日期:2023-02-04 00:41阅读:22来源:国知局
一种实现缓存数据和数据库数据一致的方法与流程

1.本发明涉及数据存储技术领域,具体的说,是一种实现缓存数据和数据库数据一致的方法。


背景技术:

2.为了提高系统性能,支撑大量用户的并发访问,系统一般会使用缓存技术,业界常用redis中间件来缓存数据。使用redis缓存可以减少磁盘io的读操作,减轻磁盘io的压力,提高数据库的可用性和可扩展性,减轻数据库的压力,提高了系统的稳定性。
3.现有技术中常用的缓存的查询和更新数据库的方法有基于边缘缓存模式即cache-aside pattern,具体流程如下:当用户请求查询数据时,首先查询缓存,如果缓存中有数据,则直接返回。如果缓存中没有查询到数据,则去数据库中查询,再把查询的数据放入到缓存中,最后返回。当更新数据库中的数据时,首先更新数据库数据,再删除缓存中的数据。由于缓存和数据库是两个不同的存储系统,以下场景,在查询数据和更新数据时,会出现缓存中的数据和数据库中的数据不一致的情况,造成系统数据错误,降低系统的可靠性,影响用户的正常使用:
4.1.删除缓存失败场景:在更新数据时,如果更新数据库成功了,但是删除缓存失败了,此时缓存中的数据和数据库中的数据不一致,用户查询数据时,总是从缓存中得到错误的数据。
5.2.数据库读写分离场景:数据库是读写分离架构时即修改数据是在主数据库,查询数据在从数据库,主数据库定时同步数据到从数据库。当用户a在主数据库更新完某条数据,并且删除缓存后,如果主数据库的数据还没有同步到从数据库,这时用户b查询这条数据,先查询缓存,发现已被删除,再查询从数据库,获取到旧数据,然后把旧数据写入到缓存中,从而造成缓存数据和数据库数据不一致的情况,同样用户查询数据时,总是从缓存中得到错误的数据。
6.3.缓存失效场景:当用户a发起请求1-更新某条数据,还没有更新完成时,用户b发起请求2-查询该条数据,如果缓存中该条数据已失效,那么请求2会直接查询到数据库中的旧数据。在这个时候,如果请求1更新数据库完成,同时已执行了删除缓存操作,然后请求2继续执行,则把旧数据再写入到缓存中。从而造成缓存数据和数据库数据不一致的情况,同样用户查询数据时,总是从缓存中得到错误的数据。


技术实现要素:

7.本发明的目的在于提供一种实现缓存数据和数据库数据一致的方法,用于解决现有技术中更新数据和查询数据方法中存在缓存数据和数据库数据不一致的问题。
8.本发明通过下述技术方案解决上述问题:
9.一种实现缓存数据和数据库数据一致的方法,包括:
10.步骤s1、系统启动时初始化内存队列,并为内存队列创建监听器,并启动监听器;
11.步骤s2、当接收到更新数据请求时,使用写锁判断该数据的修改次数是否为空,若为空则初始化该数据修改次数为1,否则该数据修改次数加1,把该数据和请求类型加入内存队列末尾;当接收到查询数据请求时,采用读锁判断该数据的修改次数是否为0或空,如果是,查询缓存数据,如果缓存中没有该数据,则查询数据库,将数据返回用户同时保存数据到缓存中;否则,把数据唯一标识和请求类型加入内存队列末尾;
12.步骤s3、监听器监听到内存队列有待处理数据时,取出内存队列数据,并根据请求类型执行更新数据流程或查询数据流程,其中:
13.更新数据流程为:删除缓存数据,再更新数据库,然后使用写锁将该数据的修改次数减1,从内存队列中删除该数据和请求类型;
14.查询数据流程为:查询缓存数据,如果缓存中没有该数据,则查询数据库,并保存数据到缓存中,从内存队列中删除该数据唯一标识和请求类型。
15.本发明中,系统首先收到查询数据请求时,数据的修改次数为空,说明该数据不在更新过程中,则直接读取缓存,提高并发处理能力。
16.系统收到对更新数据请求时,将数据和请求类型(更新数据还是查询数据)放入内存队列的队尾,同时通过设置该数据的修改次数为1,标识该条数据的状态为更新中,当队列监听器发现队列中有数据时,按照先进先出的顺序依次处理数据,首先删除缓存数据,然后再更新数据库数据,更新数据库完成后同时设置该数据的修改次数为0,并从内存队列删除该数据。当更新完数据库时,系统收到对该数据的查询数据请求时,此时该首先判断该数据的修改次数,此时修改次数为0,于是查询缓存,由于更新过程中该缓存数据删除,因此,此时缓存中没有该数据,查询数据库,查询到更新后的数据,并将数据保存到缓存中,此时缓存和数据库中的数据是一致的。若查询数据请求先于更新数据请求,此时数据的修改次数为空,同样查询缓存,由于更新过程中该缓存数据删除,因此,此时缓存中没有该数据,查询数据库,查询到更新后的数据,并将数据保存到缓存中,此时缓存和数据库中的数据是一致的。
17.假如在数据更新过程中,系统收到对查询数据请求时,由于此时该数据的修改次数仍为1,则说明还在更新状态中,此时把数据唯一标识和请求类型加入内存队列末尾,同样进入内存队列,排队处理。执行完数据更新请求时,监听器取出内存队列数据,根据查询数据请求,查询缓存数据,由于更新过程首先删除缓存数据,此时缓存中没有该数据,那么此时则查询数据库,此时查询到数据库是更新后的数据,并将更新后的数据保存至缓存,数据库数据和缓存数据是一致的。
18.系统启动时初始化多个内存队列,并为每个内存队列分别创建一个监听器,在把数据和请求类型,或者数据唯一标识和请求类型加入内存队列末尾前,还需要根据数据的数据唯一标识采用哈希算法计算出该数据需要放入的内存队列。同一数据的查询数据请求和更新数据请求在同一内存队列,依靠先进先出的顺序执行,利用队列技术,把并发请求转化为依次排队处理,,保障了并发场景下缓存数据和数据库数据的一致性,提高了系统的可靠性和稳定性。而不同数据的请求,存于不同的内存队列,可以实现处理用户并发请求,提高处理速度和效率。
19.所述更新数据流程中,当删除缓存失败时或者删除缓存成功更新数据库失败时,写锁将该数据的修改次数减1,从内存队列中删除该数据和请求类型,系统直接返回步骤
s2,并反馈更新数据失败。
20.更新数据流程中,当删除缓存失败时,不会再执行后续的步骤,缓存中仍然存在数据,数据库中仍然是更新前的数据,缓存与数据库中的数据一致。下一次执行查询数据请求时,由于该数据的修改次数已修改为0,于是查询缓存,得到的仍然是更新前的数据。当更新数据流程中,删除缓存成功,更新数据库失败时,不会再执行后续的步骤,缓存中数据为空,该数据的修改次数已修改为0,若此后遇到的是查询数据请求时,查询缓存数据,此时缓存数据为空,则去查询数据库,将从数据库查询到的数据保存至缓存,二者仍然是一致的。
21.更新数据流程中,当删除缓存失败或者删除缓存成功更新数据库失败时,若此后遇到数据更新请求,则正常执行。
22.本发明在大量用户并发请求,同时存在更新数据和查询数据时,通过排队按顺序依次处理避免了缓存数据和数据库数据不一致的情况,解决了现有技术中在删除缓存失败、数据库主从同步延迟和缓存失效的情况下导致的缓存数据和数据库数据不一致的问题。
23.本发明与现有技术相比,具有以下优点及有益效果:
24.(1)该发明利用队列技术,在大量用户并发请求、同时存在更新数据和查询数据时,把并发请求转化为依次排队处理,避免了缓存数据和数据库数据不一致的情况,提高了系统的可靠性和稳定性。
25.(2)本发明使用哈希算法,把每条数据都放到同一内存队列,不同数据的存放不同内存队列,提高并发处理能力,提高处理效率。
26.(3)本发明解决了现有技术中在删除缓存失败、数据库主从同步延迟和缓存失效的情况下导致的缓存数据和数据库数据不一致的问题。
附图说明
27.图1为本发明的原理框图。
具体实施方式
28.下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。
29.实施例1:
30.结合附图1所示,一种实现缓存数据和数据库数据一致的方法,包括:
31.步骤s1、系统启动时初始化内存队列,并为内存队列创建监听器,并启动监听器;
32.步骤s2、当接收到更新数据请求时,使用写锁判断该数据的修改次数是否为空,若为空则初始化该数据修改次数为1,否则该数据修改次数加1,把该数据和请求类型加入内存队列末尾;当接收到查询数据请求时,采用读锁判断该数据的修改次数是否为0或空,如果是,查询缓存数据,如果缓存中没有该数据,则查询数据库,将数据返回用户同时保存数据到缓存中;否则,把数据唯一标识和请求类型加入内存队列末尾;
33.步骤s3、监听器监听到内存队列有待处理数据时,取出内存队列数据,并根据请求类型执行更新数据流程或查询数据流程,其中:
34.更新数据流程为:删除缓存数据,再更新数据库,然后使用写锁将该数据的修改次数减1,从内存队列中删除该数据和请求类型;
35.查询数据流程为:查询缓存数据,如果缓存中没有该数据,则查询数据库,并保存数据到缓存中,从内存队列中删除该数据唯一标识和请求类型。
36.本发明中,系统首先收到查询数据请求时,数据的修改次数为空,说明该数据不在更新过程中,则直接读取缓存,提高并发处理能力。
37.系统收到对更新数据请求时,将数据和请求类型(更新数据还是查询数据)放入内存队列的队尾,同时通过设置该数据的修改次数为1,标识该条数据的状态为更新中,当队列监听器发现队列中有数据时,按照先进先出的顺序依次处理数据,首先删除缓存数据,然后再更新数据库数据,更新数据库完成后同时设置该数据的修改次数为0,并从内存队列删除该数据。当更新完数据库时,系统收到对该数据的查询数据请求时,此时该首先判断该数据的修改次数,此时修改次数为0,于是查询缓存,由于更新过程中该缓存数据删除,因此,此时缓存中没有该数据,查询数据库,查询到更新后的数据,并将数据保存到缓存中,此时缓存和数据库中的数据是一致的。若查询数据请求先于更新数据请求,此时数据的修改次数为空,同样查询缓存,由于更新过程中该缓存数据删除,因此,此时缓存中没有该数据,查询数据库,查询到更新后的数据,并将数据保存到缓存中,此时缓存和数据库中的数据是一致的。
38.假如在数据更新过程中,系统收到对查询数据请求时,由于此时该数据的修改次数仍为1,则说明还在更新状态中,此时把数据唯一标识和请求类型加入内存队列末尾,同样进入内存队列,排队处理。执行完数据更新请求时,监听器取出内存队列数据,根据查询数据请求,查询缓存数据,由于更新过程首先删除缓存数据,此时缓存中没有该数据,那么此时则查询数据库,此时查询到数据库是更新后的数据,并将更新后的数据保存至缓存,数据库数据和缓存数据是一致的。
39.系统启动时初始化多个内存队列,并为每个内存队列分别创建一个监听器,在把数据和请求类型,或者数据唯一标识和请求类型加入内存队列末尾前,还需要根据数据的数据唯一标识采用哈希(hash)算法计算出该数据需要放入的内存队列。同一数据的查询数据请求和更新数据请求在同一内存队列,依靠先进先出的顺序执行,利用队列技术,把并发请求转化为依次排队处理,,保障了并发场景下缓存数据和数据库数据的一致性,提高了系统的可靠性和稳定性。而不同数据的请求,存于不同的内存队列,可以实现处理用户并发请求,提高处理速度和效率。
40.所述更新数据流程中,当删除缓存失败时或者删除缓存成功更新数据库失败时,写锁将该数据的修改次数减1,从内存队列中删除该数据和请求类型,系统直接返回步骤s2,并反馈更新数据失败。
41.更新数据流程中,当删除缓存失败时,不会再执行后续的步骤,缓存中仍然存在数据,数据库中仍然是更新前的数据,缓存与数据库中的数据一致。下一次执行查询数据请求时,由于该数据的修改次数已修改为0,于是查询缓存,得到的仍然是更新前的数据。当更新数据流程中,删除缓存成功,更新数据库失败时,不会再执行后续的步骤,缓存中数据为空,该数据的修改次数已修改为0,若此后遇到的是查询数据请求时,查询缓存数据,此时缓存数据为空,则去查询数据库,将从数据库查询到的数据保存至缓存,二者仍然是一致的。
42.更新数据流程中,当删除缓存失败或者删除缓存成功更新数据库失败时,若此后遇到数据更新请求,则正常执行。
43.本发明在大量用户并发请求,同时存在更新数据和查询数据时,通过排队按顺序依次处理避免了缓存数据和数据库数据不一致的情况,解决了现有技术中在删除缓存失败、数据库主从同步延迟和缓存失效的情况下导致的缓存数据和数据库数据不一致的问题。
44.尽管这里参照本发明的解释性实施例对本发明进行了描述,上述实施例仅为本发明较佳的实施方式,本发明的实施方式并不受上述实施例的限制,应该理解,本领域技术人员可以设计出很多其他的修改和实施方式,这些修改和实施方式将落在本技术公开的原则范围和精神之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1