具体实施方式
下面将结合本发明实施例中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和展示的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本发明的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
请参阅图1,图1是本发明实施例提供的一种数据存储系统10的示意图,所述数据存储系统10包括数据库100、缓存200以及缓存更新装置300。其中,所述数据库100用于数据的长效存储,可以长时间地存储较大的数据量。所述缓存200可以进行较少量数据的高速读写。
在本实施例中,所述数据存储系统10可以是分布式系统,所述数据库100和缓存200可以设置于所述分布式系统中独立运行的电子设备中。例如,所述缓存200可以是分布式缓存组件(如,Redis、Memached等)。所述数据存储系统10也可以是一个独立的计算机系统或设备,所述数据库100、缓存200及缓存更新装置300可以是该计算机系统或设备中相对独立运行的部分。
请参阅图2,图2是本发明实施例提供的一种应用于图1所示数据存储系统10的缓存更新方法,下面对该方法的具体流程进行详细阐述。
步骤S110,在接收到数据查询请求时,查询所述缓存200中是否存在所述数据查询请求对应的目标数据。若所述缓存200中存在所述数据查询请求对应的目标数据,执行步骤S120。若所述缓存200中不存在所述数据查询请求对应的目标数据,执行步骤S140。
在本实施例中,当用户从所述数据存储系统10读取数据时,数据存储系统10会将数据库100中读写量较大的热数据加载至所述缓存200中,以便用户再次查询该热数据时直接从缓存200中读取,进而提高查询效率。
根据实际情况,数据存储系统10接收到用户终端向发送的数据查询请求时,会先查询所述缓存200中是否存储有与所述数据查询请求对应的目标数据。若所述缓存200中未存储与所述数据查询请求对应的目标数据,可以在所述数据库100中查询与所述数据查询请求对应的目标数据。针对查询到的目标数据,数据存储系统10将该目标数据加载至所述缓存200中,并返回给所述数据查询请求对应的用户终端。若所述缓存200中存储有与所述数据查询请求对应的目标数据,则判断是否需要更新所述缓存200中的该目标数据。
在本实施例中,缓存200中的数据可以键值对的形式存储,缓存200中的键值对又称缓存键。其中,键值对的键为数据查询请求中携带的查询语句(一条查询语句包括至少一个查询条件),所述键值对的值为该数据查询请求对应的目标数据。例如,基于数据查询请求中的查询语句x查询到的目标数据是y,针对此次查询,缓存200中记录的键值对的键为x,对应的值为y。
当缓存200以键值对的形式存储缓存数据时,步骤S110可以包括如下步骤:
在接收到数据查询请求时,获取所述数据查询请求中携带的查询语句;
以所述查询语句为键,查询所述缓存200中是否存在与所述键对应的值。
其中,若查询到所述缓存200中存在与所述键对应的值,查询到的值即为与所述数据查询请求对应的目标数据。
步骤S120,检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新。
其中,所述数据库100中存储的目标数据与所述缓存200中的目标数据均是指与所述数据查询请求对应的数据,但其中的具体信息可能有所不同。
例如,假设基于所述数据查询请求查询到的目标数据是一张列表,在这一情形下,所述数据库100中存储的目标数据或所述缓存200中的目标数据均是指该列表。当所述数据库100中存储的该列表中的信息发生变化时,所述数据库100中存储的该列表与所述缓存200中的该列表所包括的信息自然也变得不同。也即,所述数据库100中存储的列表相对所述缓存200中的列表有更新。
步骤S130,若所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新,将所述数据库100中存储的目标数据更新至所述缓存200中。
详细地,在检测到所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新的情况下,将所述数据库100中存储的更新后的目标数据加载至所述缓存200中,以替换所述缓存200中原本的目标数据。若无更新,则不对所述缓存200中的目标数据进行更新。
步骤S140,将所述数据库100中存储的目标数据加载至所述缓存200中,并将该目标数据返回给所述数据查询请求对应的用户终端。
在实际应用中,当查询条件较多时,可以组合得到大量的查询语句。也即,数据查询请求可能携带的查询语句的种类很多。对应地,缓存200中的缓存键也会有许多。通过上述设计,可以避免同时更新多个缓存键对数据库100造成的巨大负荷。
可选地,在本实施例中,步骤S120中检测所述数据库100中的目标数据相对所述缓存200中的该目标数据是否有更新的方式可以有多种。
例如图3所示,所述步骤S120可以包括步骤S121以及步骤S122两个子步骤。
步骤S121,检测记录的所述数据库100中的目标数据的更新时间是否晚于所述缓存200中记录的目标数据的加载时间。
步骤S122,若所述数据库100中的目标数据的更新时间晚于所述缓存200中记录的目标数据的加载时间,确定所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新。
其中,所述数据库100中的目标数据的更新时间即为所述数据库100中的目标数据发生变化的时间。在本实施例中,当所述数据库100中的某一数据发生变化时,可以记录该数据的变化时间,并将记录的变化时间与该数据相关联。
可选地,所述变化时间可以记录在所述数据库100中,也可以记录在缓存200中。本实施例优选为将变化时间记录在缓存200中,如此,既可以提高检测速度,又可以避免检测变化时间对数据库100性能造成影响。
所述缓存200中的目标数据的加载时间是指该目标数据从数据库100加载到缓存200的时间,并且是指当前时刻之前最近的一次加载发生的时间。
实施时,若检测到所述数据库100中存储的目标数据的更新时间晚于所述缓存200中记录的目标数据的加载时间,表明在当前时刻之前最近的一次加载之后,所述数据库100中存储的目标数据发生了变化。若检测到所述数据库100中的目标数据的更新时间早于或者等于所述缓存200中的目标数据的加载时间,则表明所述缓存200中的目标数据与所述数据库100中存储的目标数据一致,可以不必进行更新。
可选地,在所述步骤S120通过步骤S121及步骤S122实现的情况下,在步骤S130之后,所述方法还可以包括如下步骤:
更新记录的所述缓存200中的目标数据的加载时间。
详细地,更新记录的所述缓存200中的目标数据的加载时间是指将所述缓存200中的目标数据的加载时间更新为步骤S130的执行时间。
又例如图4所示,所述步骤S120可以包括步骤S123以及步骤S124两个子步骤。
步骤S123,检测记录的所述数据库100中的目标数据的标志位与所述缓存200中的目标数据的标志位是否相同。
步骤S124,若不同,则确定所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新。
在本实施例中,所述标志位随所述数据库100中的目标数据的变化而变化。其中,目标数据的标志位与该目标数据相关联。
作为一种实施方式,所述标志位可以为版本号。当所述数据库100中的目标数据发生变化时,该目标数据的版本号也随之变化。以上述目标数据是列表为例,假设所述数据库100中的列表当前版本号为A1,该列表加载至所述缓存200后,所述缓存200中的列表的版本号也是A1。当所述数据库100中的列表发生变化时,其版本号更新为A2,而所述缓存200中的列表的版本号仍旧为A1。
若用户在此时向所述数据存储系统10查询该列表,检测到的所述数据库100中的列表的版本号就与所述缓存200中的列表版本号不同,表明所述数据库100中的列表相对所述缓存200中的列表有更新。
作为另一种实施方式,所述标志位可以为所述数据库100中的目标数据的更新时间。假设数据库100中存储有数据data1,记录的所述数据库100最近一次更新data1的时间为t1,且缓存200中不存在data1。在这一情形下,当数据存储系统10接收到查询data1的数据查询请求时,会将所述数据库100中的data1加载至所述缓存200中,并记录t1作为标志位。
若另一用户终端U2再次查询data1,并且数据库100中存储的data1在用户终端U2进行该次查询前的t2时刻发生了更新,则记录的数据库100中的data1的更新时间变为由t1变为t2,相当于记录的数据库100中的data1的标志位由t1变为t2。然而,此时缓存200中的data1的标志位仍旧为t1,与数据库100中的data1的标志位不同。
若用户终端U2进行该次查询前数据库100中的data1未发生更新,那么所记录的数据库100中的data1的标志位仍旧为t1,与缓存200中的data1的标志位相同。
可选地,在本实施例中,所述缓存200中的目标数据的标志位记录在所述缓存200中。所述数据库100中的目标数据的标志位既可以记录在数据库100中,也可以记录在所述缓存200中。
其中,当所述数据库100中的目标数据的标志位记录在数据库100中时,可以直接记录在所述目标数据中。例如,当所述目标数据为列表时,所述标志位可以直接记录在该列表中。当所述数据库100中的该列表更新至所述缓存200中时,缓存200中记录的目标数据的标志位也随之发生改变,可以不必对缓存200中的目标数据的标志位进行额外的更新操作。
当所述数据库100中的目标数据的标志位记录在缓存200中时,在所述数据库100中的目标数据更新至所述缓存200中之后,也即,在步骤S130之后,所述方法还包括:
将所述缓存200中的目标数据的标志位更新为所述数据库100中的目标数据的标志位,以表征缓存200中的目标数据与数据库100中的目标数据一致。
可选地,在本实施例中,在接收到数据查询请求且检测到缓存200中存储有与数据查询请求对应的目标数据时,所述方法还可以包括如下步骤:
在检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新的同时,异步从所述缓存200中获取该目标数据并返回给所述数据查询请求对应的用户终端。
也即,在接收到数据查询请求时,若缓存200中存在与所述数据查询请求对应的目标数据,则立即将该目标数据返回给所述数据查询请求对应的用户终端,而不必管所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新,以及在有更新的情况下,所述缓存200中的目标数据是否完成更新。
在这一情形下,针对数据库100中的目标数据的每次更新,触发缓存200更新的用户所查询到的目标数据与数据库100中实际存储的目标数据可能不同,但能够保证绝大多数用户查询到的数据与数据库100中的数据一致,并且能在用户查询时立即返回数据给用户,用户体验更好。
此外,当数据库100中的目标数据相对缓存200中的目标数据没有更新时,缓存200中的目标数据本就与数据库100中的目标数据一致,也就没有必要等到检测完毕后再返回目标数据给用户。经发明人研究发现,在实际应用中,上述情形出现较多,因此,采用异步过程执行上述步骤只可能导致极少数用户所查询的数据不准确。
可选地,在接收到数据查询请求且检测到缓存200中存储有与数据查询请求对应的目标数据时,也可以先检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新。若无更新,则将缓存200中的目标数据返回给所述数据查询请求对应的用户终端。若有更新,则在将所述数据库100中存储的目标数据更新至所述缓存200中之后,再将所述缓存200中更新后的目标数据返回给所述数据查询请求对应的用户终端。
也即,在将所述数据库100存储的目标数据更新至所述缓存200中的步骤之后,所述方法还可以包括如下步骤:
从所述缓存200中获取更新后的目标数据并返回给所述数据查询请求对应的用户终端。
在这一情形下,检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新的步骤与将缓存200中的目标数据返回给数据查询请求对应的用户终端的步骤为同步过程。如此,可以保证每个用户从缓存200中获取到的数据都与数据库100中的数据一致,但每次查询都需要在检测有无更新后才将目标数据返回给用户,无法满足即时性。
通过上述设计,在用户每次查询时判断是否需要更新缓存200,能够保证用户查询到的数据与数据库100中的数据一致。每次更新时,至多更新用户该次查询的目标数据,更新数据量少,能够避免缓存键较多的情形下,同时更新大量数据对数据库100造成的巨大负荷。
此外,通过标志位、时间等标志数据来判断数据库100中的目标数据相对缓存200中的目标数据是否有更新,每次检测时只需读取目标数据的标志数据即可。然而通常情况下,数据库100中存储的目标数据(如,列表)的数据量远远大于标志数据。因此,通过上述设计,还可进一步降低数据库100的符合,提高数据存储系统10的性能。
如图5所示,本发明实施例还提供一种缓存更新装置300,所述缓存更新装置300包括查询模块310、更新检测模块320以及缓存更新模块330。
其中,所述查询模块310用于在接收到数据查询请求时,查询所述缓存200中是否存在所述数据查询请求对应的目标数据。
在本实施例中,关于所述查询模块310的描述具体可参考对图2所示步骤S110的详细描述,也即,步骤S110可由所述查询模块310执行。
可选地,在本实施例中,所述缓存200中的数据以键值对的形式存储,其中,键值对的键为数据查询请求中携带的查询语句,所述键值对的值为该数据查询请求对应的目标数据。
如此,所述查询模块310在接收到数据查询请求时,查询所述缓存200中是否存在该数据查询请求对应的目标数据的方式,可以包括:
在接收到数据查询请求时,获取该数据查询请求中携带的查询语句;
以所述查询语句为键,查询所述缓存200中是否存在与所述键对应的值。
所述更新检测模块320用于在所述缓存200中存在所述数据查询请求对应的目标数据时,检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新。
在本实施例中,关于所述更新检测模块320的描述具体可参考对图2所示步骤S120的详细描述,也即,步骤S120可由所述更新检测模块320执行。
可选地,在本实施例中,所述更新检测模块320检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新的方式,可以有多种。例如:
检测记录的所述数据库100中目标数据的更新时间与所述缓存200中记录的目标数据的加载时间是否相同,该加载时间是指目标数据从数据库100加载到缓存200的时间;
若不同,则确定所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新。
在这一情形下,所述缓存更新装置300还可以包括时间更新模块340,所述时间更新模块340用于在将所述数据库100中存储的目标数据更新至所述缓存200中之后,更新所述缓存200中记录的目标数据的加载时间。
又例如,所述更新检测模块320检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新的方式,可以包括:
检测记录的所述数据库100中目标数据的标志位与所述缓存200中的目标数据的标志位是否相同;
若不同,则确定所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新。
其中,目标数据的标志位可以为该目标数据的版本号或者为所述数据库100中的该目标数据发生变化的时间。
在本实施例中,当所述数据库100中的目标数据的标志位直接记录在所述数据库100的目标数据中时,若将数据库100中的目标数据更新至缓存200中的同时,缓存200中的目标数据的标志位也随之更新。而除此之外的其他情形,则需要在缓存200中的目标数据更新后,对缓存200中的目标数据的标志位进行更新,这一更新步骤也可通过上述时间更新模块340执行。
所述缓存更新模块330用于在所述数据库100中存储的目标数据相对所述缓存200中的目标数据有更新时,将所述数据库100中存储的目标数据更新至所述缓存200中。
在本实施例中,关于所述缓存更新模块330的描述具体可参考对图2所示步骤S130的详细描述,也即,步骤S130可由所述缓存更新模块330执行。
可选地,所述缓存更新装置300还可以包括第一数据返回模块350。所述第一数据返回模块350可以异步方式返回目标数据给用户终端,也可以同步方式返回目标数据给用户终端。
当以异步方式返回目标数据给用户终端时,所述第一数据返回模块350用于在检测所述数据库100中存储的目标数据相对所述缓存200中的目标数据是否有更新的同时,异步从所述缓存200中获取该目标数据并返回给所述数据查询请求对应的用户终端。
当以同步方式以异步方式返回目标数据给用户终端时,所述第一数据返回模块350用于在将所述数据库100存储的目标数据更新至所述缓存200中之后,从所述缓存200中获取更新后的目标数据并返回给所述数据查询请求对应的用户终端。
在本实施例中,关于所述第一数据返回模块350的描述具体可参考上述内容中对相关步骤的详细描述。
可选地,所述缓存更新装置300还可以包括第二数据返回模块360。
所述第二数据返回模块360用于在所述缓存200中不存在该目标数据时,将所述数据库100中存储的目标数据加载至所述缓存200中,并将该目标数据返回给所述数据查询请求对应的用户终端。
在本实施例中,关于所述第二数据返回模块360的描述具体可参考对图2所示步骤S140的详细描述,也即,步骤S140可以由所述加载返回模块执行。
本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被执行时实现本发明提供的缓存更新方法。
综上所述,本发明提供的缓存更新方法、装置及数据存储系统10,
在查询到缓存200中存在数据查询请求对应的目标数据时,检测数据库100中存储的目标数据相对缓存200中的目标数据是否有更新,若有更新,则更新缓存200中与该数据查询请求对应的目标数据。通过上述设计,既能够保证用户查询到的数据与数据库100中的数据一致,又能够避免同时更新多个目标数据对数据库100造成的巨大压力。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。