一种数据写入方法、数据读取方法及装置
技术领域
本公开涉及数据处理技术领域,具体而言,涉及一种数据写入方法、数据读取方法及装置。
背景技术
缓存是数据交换的缓冲区,由于缓存的读写速度较快,因此,利用缓存可以提升数据读取或写入的效率,而且缓存可以分担持久化存储器的性能压力。例如,当读取数据时,先从缓存中查找所需数据,若查找到则直接从缓存中进行读取;当写入数据时,先将待写入的数据写入持久化存储器,然后再将数据写入缓存中。由此可见,通过缓存能够可以为读写过程带来便利,因此,缓存得到了越来越广泛的应用。
但是发明人在实现本发明的过程中发现,在高并发的数据读写下,缓存中容易存储无效数据,从而出现缓存和持久化存储器中存储的数据不一致的情况。
发明内容
本公开实施例至少提供一种数据写入方法、数据读取方法及装置,可以使缓存和持久化存储器中存储的数据保持一致。
第一方面,本公开实施例提供了一种数据写入方法,所述数据写入方法包括:
接收针对目标对象的数据写入请求,从所述数据写入请求中解析出所述目标对象对应的第一数据;
将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号;
判断缓存中是否存在与所述目标对象对应的第二数据,若存在所述第二数据,判断所述第二数据的版本号是否小于或等于所述第一数据的版本号;
若所述第二数据的版本号小于或等于所述第一数据的版本号,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
一种可选的实施方式中,所述将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号,包括:
在接收到所述数据写入请求时,判断所述持久化存储器中是否存在所述目标对象对应的第三数据;
若存在所述第三数据,则将所述第三数据替换成所述第一数据,写入所述持久化存储器中,基于所述第三数据的版本号生成所述第一数据的版本号。
一种可选的实施方式中,在所述判断所述持久化存储器中是否存在所述目标对象对应的第三数据之后,所述数据写入方法包括:
若不存在所述第三数据,则将所述第一数据写入所述持久化存储器中,并为所述第一数据分配预设版本号。
一种可选的实施方式中,在所述判断缓存中是否存在与所述目标对象对应的第二数据之后,所述数据写入方法还包括:
若不存在所述第二数据,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
一种可选的实施方式中,在所述判断所述第二数据的版本号是否小于或等于所述第一数据的版本号之后,所述数据写入方法还包括:
若所述第二数据的版本号大于所述第一数据的版本号,则向发送所述数据写入请求的请求端反馈所述第一数据写入失败的提示消息。
第二方面,本公开实施例还提供一种数据读取方法,所述数据读取方法包括:
接收针对目标对象的数据读取请求时,判断缓存中是否存在与所述目标对象对应的第一数据;
若不存在所述第一数据,从持久化存储器中读取所述目标对象对应的第二数据,以及所述第二数据的版本号;
判断所述缓存中是否存在与所述目标对象对应的第三数据,若存在所述第三数据,判断所述第三数据的版本号是否小于或等于所述第二数据的版本号;
若所述第三数据的版本号小于或等于所述第二数据的版本号,则将所述第二数据,以及所述第二数据的版本号写入所述缓存。
一种可选的实施方式中,在所述判断所述缓存中是否存在与所述目标对象对应的第三数据之后,所述数据读取方法还包括:
若不存在所述第三数据,则将所述第二数据,以及所述第二数据写入所述缓存。
一种可选的实施方式中,在所述判断所述第三数据的版本号是否小于或等于所述第二数据的版本号之后,所述数据读取方法还包括:
若所述第三数据的版本号大于所述第二数据的版本号,则向发送所述读取请求的请求端反馈所述第二数据写入失败的提示消息。
一种可选的实施方式中,在所述判断缓存中是否存在与所述目标对象对应的第一数据之后,所述数据读取方法还包括:
若存在所述第一数据,则从所述缓存中读取所述第一数据。
第三方面,本公开实施例还提供一种数据写入装置,所述数据写入装置包括:
接收模块,用于接收针对目标对象的数据写入请求,从所述数据写入请求中解析出所述目标对象对应的第一数据;
第一写入模块,用于将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号;
判断模块,用于判断缓存中是否存在与所述目标对象对应的第二数据,若存在所述第二数据,判断所述第二数据的版本号是否小于或等于所述第一数据的版本号;
第二写入模块,用于若所述第二数据的版本号小于或等于所述第一数据的版本号,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
一种可选的实施方式中,所述第一写入模块包括:
判断单元,用于在接收到所述数据写入请求时,判断所述持久化存储器中是否存在所述目标对象对应的第三数据;
写入单元,用于若存在所述第三数据,则将所述第三数据替换成所述第一数据,写入所述持久化存储器中,基于所述第三数据的版本号生成所述第一数据的版本号。
一种可选的实施方式中,所述写入单元,还用于若不存在所述第三数据,则将所述第一数据写入所述持久化存储器中,并为所述第一数据分配预设版本号。
一种可选的实施方式中,所述第二写入模块,还用于:
若不存在所述第二数据,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
一种可选的实施方式中,所述数据写入装置还包括:
发生模块,用于若所述第二数据的版本号大于所述第一数据的版本号,则向发送所述数据写入请求的请求端反馈所述第一数据写入失败的提示消息。
第四方面,本公开实施例还提供一种数据读取装置,所述数据读取装置包括:
第一判断模块,用于接收针对目标对象的数据读取请求时,判断缓存中是否存在与所述目标对象对应的第一数据;
第一读取模块,用于若不存在所述第一数据,从持久化存储器中读取所述目标对象对应的第二数据,以及所述第二数据的版本号;
第二判断模块,用于判断所述缓存中是否存在与所述目标对象对应的第三数据,若存在所述第三数据,判断所述第三数据的版本号是否小于或等于所述第二数据的版本号;
写入模块,用于若所述第三数据的版本号小于或等于所述第二数据的版本号,则将所述第二数据,以及所述第二数据的版本号写入所述缓存。
一种可选的实施方式中,所述写入模块,还用于:
若不存在所述第三数据,则将所述第二数据,以及所述第二数据写入所述缓存。
一种可选的实施方式中,所述数据读取装置还包括:
发送模块,用于若所述第三数据的版本号大于所述第二数据的版本号,则向发送所述读取请求的请求端反馈所述第二数据写入失败的提示消息。
一种可选的实施方式中,所述数据读取装置还包括:
第二读取模块,用于若存在所述第一数据,则从所述缓存中读取所述第一数据。
第五方面,本公开实施例还提供一种计算机设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当计算机设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤,和/或执行上述第二方面,或第二方面中任一种可能的实施方式中的步骤。
第六方面,本公开实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤,和/或执行上述第二方面,或第二方面中任一种可能的实施方式中的步骤。
本公开实施例提供的数据写入方法及装置,通过为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第二数据的版本号小于或等于请求写入的第一数据的版本号时,才允许第一数据写入缓存,即,只允许最新版本的数据写入缓存,与现有技术在高并发的数据读写下,缓存中容易存储无效数据相比,可以实现使缓存和持久化存储器中存储的数据保持一致,以便可以利用缓存来提升数据读取或写入的效率。
进一步,本公开实施例提供的数据读取方法及装置,接收目标对象的数据读取请求时,若判断出缓存中不存在与目标对象对应的第一数据,则从持久化存储器中读取目标对象对应的第二数据,以及第二数据的版本号,此时,再次判断缓存中是否存在与目标对象对应的第三数据,若存在,且第三数据的版本号小于或等于第二数据的版本号,则将第二数据,以及第二数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第三数据的版本号小于或等于请求写入的第二数据的版本号时,才允许第二数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致,以便可以利用缓存来提升数据读取或写入的效率。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本公开实施例所提供的一种数据写入方法的流程图;
图2示出了具体实施例中数据写入方法的流程图;
图3示出了本公开实施例所提供的一种数据读取方法的流程图;
图4示出了本公开实施例所提供的一种数据写入装置的示意图之一;
图5示出了本公开实施例所提供的数据写入装置中,第一写入模块的具体示意图;
图6示出了本公开实施例所提供的一种数据写入装置的示意图之二;
图7示出了本公开实施例所提供的一种数据读取装置的示意图之一;
图8示出了本公开实施例所提供的一种数据读取装置的示意图之二;
图9示出了本公开实施例所提供的一种计算机设备的示意图。
图示说明:400-数据写入装置;410-接收模块;420-第一写入模块;430-判断模块;440-第二写入模块;421-判断单元;422-写入单元;450-发送模块;700-数据读取装置;710-第一判断模块;720-第一读取模块;730-第二判断模块;740-写入模块;750-发送模块;760-第二读取模块;900-计算机设备;901-处理器;902-存储器;9021-内存;9022-外部存储器;903-总线。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
经研究发现,由于缓存的读写速度较快,通常利用缓存可以提升数据读取或写入的效率,而且缓存可以分担持久化存储器的性能压力。但是,在高并发的数据读写下,缓存中容易存储无效数据,从而出现缓存和持久化存储器中存储的数据不一致的情况。例如,在高并发场景下,读请求从持久化存储器中读取用户昵称为A,此时线程阻塞,暂停执行读请求,而此时有写请求将持久化存储器中的用户昵称从A改为B,并将缓存中的用户昵称设置为B;读请求恢复执行时,会将缓存中的用户昵称B替换成读取到的用户昵称A,就会造成缓存中存储的是无效数据,即用户昵称A,而持久化存储器中存储的是更新的用户昵称B,这样,就会出现缓存和持久化存储器中存储的数据不一致的情况。
对于上述出现的缓存和持久化存储器中存储的数据不一致的情况,现有技术中通常采用二种方式进行处理,方式一:通过缩短缓存的有效时间,来达到最终一致性;方式二:针对数据写入请求,延时删除缓存中的数据。对于方式一,在高并发场景下,缩短缓存有效时间,会导致持久化存储的读压力上升;对于方式二,延时删除缓存中的数据,会造成缓存存储的数据较多,降低处理数据读写请求的效率。
基于上述研究,本公开提供了一种数据写入方法、数据读取方法及装置,其中,数据写入方法包括接收针对目标对象的数据写入请求,将从数据写入请求中解析出的目标对象对应的第一数据写入持久化存储器中,并为第一数据分配版本号,进而,判断出缓存中存在与目标对象对应的第二数据,再判断第二数据的版本号是否小于或等于第一数据的版本号,进一步地,若是,则将第一数据,以及第一数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第二数据的版本号小于或等于请求写入的第一数据的版本号时,才允许第一数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致。
需要说明的是,缓存可以为单机缓存,如服务器内存,缓存也可以为集群缓存,如redis缓存;可持久化存储器可以为磁盘,可持久化存储器也可以为数据库(DataBase,DB),如mysql数据库。
通常,缓存常见的使用场景包括读写场景:当写入数据时,先将待写入的数据写入持久化存储器中进行存储,之后删除缓存中的无效数据或者将最新数据写入缓存中;当读取数据时,先从缓存中查找所需数据,若有则直接从缓存中读取,若无则查询持久化存储器,并将查询到的数据写入缓存中。
本公开阐述的方案,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人对本公开做出的贡献。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种数据写入方法进行详细介绍,本公开实施例所提供的数据写入方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备,终端设备可以为用户设备(User Equipment,UE)、移动设备、用户终端、终端、蜂窝电话、无线电话、个人数字处理(Personal Digital Assistant,PDA)、手持设备、计算设备、车载设备、可穿戴设备等。在一些可能的实现方式中,该数据写入方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
下面以执行主体为计算机设备为例对本公开实施例提供的数据写入方法加以说明。
实施例一
参见图1所示,为本公开实施例提供的一种数据写入方法的流程图,所述方法包括步骤S101~S104,其中:
S101:接收针对目标对象的数据写入请求,从所述数据写入请求中解析出所述目标对象对应的第一数据。
在该步骤中,在接收到数据写入请求时,通常先将请求写入的第一数据写入持久化存储器,之后再将请求写入的第一数据写入缓存中。
需要说明的是,无论是缓存还是持久化存储器中的数据,均是以键值对(key-value)的形式存储数据,“键”即关键字。例如,用户A的昵称a,“用户A的昵称”即为“键”,“a”为“值”。对于本公开,“键”即目标对象,“值”即目标对象对应的数据,比如,目标对象为用户A昵称,目标对象对应的数据为用户A的昵称a。本公开中第一数据、第二数据、第三数据,为同一“键”(目标对象)对应的数据,但第一数据、第二数据、第三数据的“值”可能不同,相同“键”不同“值”对应的数据的版本号可能不同,其中,版本号可以用数字进行表示。在接收到数据写入请求时,可以从数据读写入请求中解析出第一数据,以及第一数据对应的目标对象,进而,根据目标对象,可以判断缓存中是否存在与目标对象对应的第二目标数据。
S102:将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号。
在该步骤中,在接收到数据写入请求时,先将数据写入请求中的第一数据写入持久化存储器中,并为写入持久化存储器中的第一数据分配版本号。这里,根据当前持久化存储器中存储与目标对象对应数据的情况,来为写入持久化存储器中的第一数据分配版本号,具体地,若当前持久化存储器中不存在与目标对象对应的数据,则为第一数据分配预设版本号,预设版本号优选设为1或0;若当前持久化存储器中存在与目标对象对应的数据,则为第一数据分配的版本号为将该数据的版本号更新后的版本号。通常,更新就是对原版本号加预设数值,优选加1,比如,该数据的版本号为2,则更新后的版本号为3,则为第一数据分配的版本号为3。
需要说明的是,每次数据写入持久化存储器时,都需要为写入的数据分配版本号,在确定可以将该数据写入缓存时,将该数据,以及该数据对应的版本号一同写入缓存中。通过为持久化存储器中的数据分配版本号,可以明确每次写入持久化存储器中数据的版本,以便根据版本号,来确定将最新版本的数据写入缓存。这样,可以使缓存和持久化存储器中存储的数据保持一致。
进一步地,步骤S102中所述将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号,包括以下步骤:
步骤a1:在接收到所述数据写入请求时,判断所述持久化存储器中是否存在所述目标对象对应的第三数据。
在该步骤中,在接收到针对目标对象对应的第一数据的数据写入请求后,无论持久化存储器中是否存在目标对象对应的第三数据,都需要将第一数据写入持久化存储器中。在不同的判断结果下,为即将写入持久化存储器的第一数据来分配的版本号有所不同,即,对持久化存储器中存在第三数据的情况,以及持久化存储器中不存在第三数据的情况,为第一数据分配不同的版本号。
这里,对持久化存储器中存在第三数据,为请求写入的第一数据分配版本号的情况进行阐述:
步骤a2:若存在所述第三数据,则将所述第三数据替换成所述第一数据,写入所述持久化存储器中,基于所述第三数据的版本号生成所述第一数据的版本号。
具体地,若判断出持久化存储器中存在与目标对象对应的第三数据,则将第三数据替换成第一数据写入持久化存储器中,并将基于第三数据的版本号更新成生成第一版本号后,来作为第一数据的版本号。这里,每次对版本号进行更新是指对当前版本号加上预设数值,预设数值优选为1,即第一版本号是由第三数据的版本号与预设数值相加得到的,比如,第三数据的版本号为2,则第一版本号为2+1=3。
这里,对持久化存储器中不存在第三数据,为请求写入的第一数据分配版本号的情况进行阐述:
步骤a3:若不存在所述第三数据,则将所述第一数据写入所述持久化存储器中,并为所述第一数据分配预设版本号。
具体地,若判断出持久化存储器中不存在与目标对象对应的第三数据,则将第一数据写入持久化存储器中,并为第一数据分配预设版本号。这里,预设版本号为预先设置的,用于表征初始版本的数据的版本号,预设版本号可以设为0或1。
S103:判断缓存中是否存在与所述目标对象对应的第二数据,若存在所述第二数据,判断所述第二数据的版本号是否小于或等于所述第一数据的版本号。
在该步骤中,在将请求写入的第一数据写入持久化存储器之后,此时需要将第一数据写入缓存,在写入之前,要判断第一数据是否满足写入缓存的条件,即,判断第一数据的版本是否大于或等于缓存中与目标对象对应的数据的版本,若满足,允许写入,若不满足,不允许写入,具体地,若确定缓存中存在与请求写入的第一数据具有相同目标对象的第二数据,则获取第二数据的版本号,并判断第二数据的版本号是否小于或等于第一数据的版本号,即,判断要写入缓存的第一数据是否为最新版本的数据,若第一数据是最新版本的数据,说明要写入的第一数据为有效数据,允许写入;若第一数据不是最新版本的数据,说明要写入的第一数据为无效数据,拒绝写入。
S104:若所述第二数据的版本号小于或等于所述第一数据的版本号,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
在该步骤中,若确定缓存中存在与数据写入请求中的目标对象对应的第二数据,且第二数据的版本号小于或等于第一数据的版本号,即第一数据是最新版本的数据,说明要写入的第一数据为有效数据,允许写入。通过只允许将最新版本的数据写入缓存,可以避免将无效数据覆盖掉更新的数据的情况发生,以此实现可持久化存储器和缓存之间数据的一致性。这里,在将第一数据写入的同时,还要将第一数据的版本号也写入缓存,以便下次有针对目标对象的数据要写入缓存时,可以利用版本号,判断是否允许该数据写入缓存。
进一步地,若缓存中存在与所述目标对象对应的第二数据,在步骤S103判断所述第二数据的版本号是否小于或等于所述第一数据的版本号之后,还包括以下步骤:
若所述第二数据的版本号大于所述第一数据的版本号,则向发送所述数据写入请求的请求端反馈所述第一数据写入失败的提示消息。
在该步骤中,若确定缓存中存在与数据写入请求中的目标对象对应的第二数据,且第二数据的版本号大于第一数据的版本号,即第一数据不是最新版本的数据,说明要写入的第一数据为无效数据,拒绝写入,并向发送针对目标对象对应的第一数据的数据写入请求的请求端反馈第一数据写入失败的提示消息,以便请求端的用户知晓要写入缓存的第一数据为无效数据。通过只允许将最新版本的数据写入缓存,可以避免将无效数据覆盖掉更新的数据的情况发生,以此实现可持久化存储器和缓存之间数据的一致性。
进一步地,在步骤S103所述判断缓存中是否存在与所述目标对象对应的第二数据之后,还包括以下步骤:
若不存在所述第二数据,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
在该步骤中,在将请求写入的第一数据写入持久化存储器之后,此时,需要将第一数据写入缓存,在写入之前,要判断第一数据是否满足写入缓存的条件。,即,判断第一数据的版本是否大于或等于缓存中与目标对象对应的数据的版本,若满足,允许写入,若不满足,不允许写入,若确定缓存中不存在与数据写入请求中的目标对象对应的第二数据,说明第一数据为有效数据,可以直接将请求写入的第一数据,以及第一数据的版本号写入缓存中。
一示例中,在高并发场景下,在接收到一个写入用户甲昵称A的请求时,判断持久化存储器中是否存在用户甲昵称B,若存在,将用户甲昵称B替换成用户甲昵称A写入持久化存储器中,其中,用户甲昵称B的版本号为1,将用户甲昵称B的版本号1更新成2作为用户甲昵称A的版本号。进而,判断当前缓存中是否存在与用户甲昵称对应的用户甲昵称C,若存在用户甲昵称C,判断用户甲昵称C的版本号是否小于或等于用户甲昵称A的版本号2,若用户甲昵称C的版本号小于或等于用户甲昵称A的版本号2,则将用户甲昵称A,以及用户甲昵称A的版本号2关联写入缓存。这样,通过只允许将最新版本的用户甲昵称A写入缓存,使最终缓存和持久化存储器中存储的均为最新的用户甲昵称A,以此实现可持久化存储器和缓存之间数据的一致性。
需要说明的是,本公开通过为持久化存储器中的数据添加版本号,通过判断版本号是否为最新的版本号,来确定是否允许数据写入缓存,而且,本公开在处理缓存与持久化存储器中数据一致性的问题时,在高并发性能要求高的场景下,也可以实现快速处理,甚至将处理时间控制在毫秒级。
还需要说明的是,如果同时接收到针对目标对象的两个数据写入请求,其中,一个数据写入请求要写入第一数据,另一个数据写入请求要写入第二数据,持久化存储器为第一数据分配版本号3,持久化存储器为第二数据分配版本号2。若版本号3和版本号2均大于当前缓存中与目标对象对应的第三数据的版本号1,且版本号3大于版本号2,则在第一数据和第二数据中选取版本号最大的数据写入缓存。即,将版本号3对应的第一数据,以及版本号3关联写入缓存,其中,持久化存储器存储的版本号3对应的第一数据。这里,当两个数据写入请求并发,且未同时写入缓存时,无论将哪个数据写入缓存,根据上述方案,缓存中最终存储的数据的版本都应是版本号3。
图2示出了具体实施例中数据写入方法的流程图;如图2所示,以用户乙的昵称为例,对本公开的方案以示例的形式进行阐述:
S201:接收针对用户乙的昵称对应的昵称a的数据写入请求,跳转至步骤S202。
S202:判断持久化存储器中是否存在用户乙的昵称对应的昵称b,若存在跳转至步骤S203,若不存在跳转至步骤S204。
步骤S203:若持久化存储器中存在用户乙的昵称对应的昵称b,将用户乙的昵称b替换成用户乙的昵称a写入持久化存储器中,并将用户乙的昵称b的版本号1更新成版本号2作为用户乙的昵称a的版本号,跳转至步骤S205。
步骤S204:若持久化存储器中不存在用户乙的昵称对应的昵称b,将用户乙的昵称a写入持久化存储器中,并为用户乙的昵称a分配预设版本号0,跳转至步骤S205。
步骤S205:判断缓存中是否存在与用户乙的昵称对应的昵称c,若存在跳转至步骤S206,若不存在跳转至步骤S207。
步骤S206:若缓存中存在与用户乙的昵称对应的昵称c,判断用户乙的昵称c的版本号是否小于或等于用户乙的昵称a的版本号,若是跳转至步骤S208,若不存在跳转至步骤S209。
步骤S207:若缓存中不存在与用户乙的昵称对应的昵称c,将用户乙的昵称a,以及用户乙的昵称a的版本号2关联写入缓存,结束本次针对用户乙的昵称a写入请求。
步骤S208:若用户乙的昵称c的版本号小于或等于用户乙的昵称a的版本号,将用户乙的昵称a,以及用户乙的昵称a的版本号2关联写入缓存,结束本次针对用户乙的昵称a写入请求。
步骤S209:若用户乙的昵称c的版本号大于用户乙的昵称a的版本号,向发送数据写入请求的请求端反馈用户乙的昵称a写入失败的提示消息,结束本次针对用户乙的昵称a写入请求。
在本公开实施例中,接收到针对目标对象的数据写入请求,将从数据写入请求中解析出目标对象对应的第一数据写入持久化存储器中,并为第一数据分配版本号,进而,在判断出缓存中存在与目标对象对应的第二数据,则判断第二数据的版本号是否小于或等于第一数据的版本号,进一步地,若是,则将第一数据,以及第一数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第二数据的版本号小于或等于请求写入的第一数据的版本号时,才允许第一数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致。
下面以执行主体为计算机设备为例对本公开实施例提供的数据读取方法加以说明。
实施例二
参见图3所示,为本公开实施例提供的另一种数据读取方法的流程图,所述方法包括步骤S301~S304,其中:
S301:接收针对目标对象的数据读取请求时,判断缓存中是否存在与所述目标对象对应的第一数据。
在该步骤中,在接收到携带有目标对象的数据读取请求时,先判断缓存中是否存在与请求读取的目标对象对应的第一数据,通常情况下,在缓存中存在第一数据时,直接从缓存中读取第一数据,完成对第一数据读取请求的处理;在缓存中不存在第一数据时,需要从持久化存储器中读取目标对象对应的第二数据。在读取后,将读取到的第二数据写入缓存中,以便下次针对第二数据的读取请求时,可以从缓存中直接读取到第二数据,无需从持久化存储器中读取第二数据,可利用缓存来提升数据读取效率和数据存储系统的性能。
进一步地,在步骤S301判断缓存中是否存在与所述目标对象对应的第一数据之后,存在两种情况:
情况一:缓存中不存在与目标对象对应的第一数据,下面对这一情况进行阐述:
S302:若不存在所述第一数据,从持久化存储器中读取所述目标对象对应的第二数据,以及所述第二数据的版本号。
在该步骤中,若确定出缓存中不存在与目标对象对应的第一数据,需要从持久化存储器中读取目标对象对应的第二数据,以及读取第二数据的版本号。这里,持久化存储器中存储有数据,以及数据对应的版本号。
进一步地,在判断是否可以将读取到的第二数据写入缓存时,可以通过版本号是否为最新版本号来判断。
S303:判断所述缓存中是否存在与所述目标对象对应的第三数据,若存在所述第三数据,判断所述第三数据的版本号是否小于或等于所述第二数据的版本号。
在该步骤中,在从持久化存储器中读取到与目标对象对应的第二数据之后,再次判断缓存中是否存在与目标对象对应的第三数据,若存在第三数据,判断第三数据的版本号是否小于或等于第二数据的版本号,即,判断要写入缓存的第二数据的版本号是否为最新版本号。
进一步地,若不存在所述第三数据,则将所述第二数据,以及所述第二数据写入所述缓存。
在该步骤中,在从持久化存储器中读取到与目标对象对应的第二数据之后,再次判断缓存中是否存在与目标对象对应的第三数据,若不存在第三数据,可以直接将第二数据,以及第二数据写入缓存。
S304:若所述第三数据的版本号小于或等于所述第二数据的版本号,则将所述第二数据,以及所述第二数据的版本号写入所述缓存。
在该步骤中,若存在第三数据,判断第三数据的版本号是否小于或等于第二数据的版本号,即,判断要写入缓存的第二数据的版本号是否为最新版本号,若第三数据的版本号小于或等于第二数据的版本号,说明要写入缓存的第二数据的版本号为当前最新的版本号,则将第二数据,以及第二数据的版本号写入缓存。通过将最新版本的数据写入缓存,这样,可以避免将无效数据覆盖掉更新的数据的情况发生,以此实现可持久化存储器和缓存之间数据的一致性。
进一步地,若所述第三数据的版本号大于所述第二数据的版本号,则向发送所述读取请求的请求端反馈所述第二数据写入失败的提示消息。
在该步骤中,若第三数据的版本号大于第二数据的版本号,说明要写入缓存的第二数据的版本号不为当前最新的版本号,即,第二数据为无效数据,则拒绝将第二数据写入缓存。通过将最新版本的数据写入缓存,这样,可以避免将无效数据覆盖掉更新的数据的情况发生,以此实现可持久化存储器和缓存之间数据的一致性。
情况二:缓存中存在与目标对象对应的第一数据,下面对这一情况进行阐述:
若缓存中存在与目标对象对应的第一数据,则从所述缓存中读取所述第一数据。
在该步骤中,当接收到携带有目标对象的数据读取请求时,若确定出缓存中存在与目标对象对应的第一数据,可以从缓存中直接读取第一数据,完成对目标对象对应的第一数据的数据读取请求的处理。
需要说明的是,本申请采用的是基于持久化存储器存储数据的版本号,来进行缓存的写入控制,通常的持久化存储器都已经具备了版本控制的能力,因此,可靠性更高、成本更低。具体地,进行缓存控制时,在判断出要写入数据的版本号大于或等于缓存中对应数据的版本号时,才允许将该数据写入缓存,这样,可以实现持久化存储器中的数据和缓存中的数据保持一致。
在本公开实施例中,在接收到携带有目标对象的数据读取请求时,若判断出缓存中不存在与目标对象对应的第一数据,则从持久化存储器中读取目标对象对应的第二数据,以及第二数据的版本号,此时,再次判断缓存中是否存在与目标对象对应的第三数据,若存在,且第三数据的版本号小于或等于第二数据的版本号,则将第二数据,以及第二数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第三数据的版本号小于或等于请求写入的第二数据的版本号时,才允许第二数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致,以便可以利用缓存来提升数据读取或写入的效率。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与数据写入方法对应的数据写入装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述数据写入方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
实施例三
参照图4-图6所示,图4为本公开实施例提供的一种数据写入装置400的示意图之一;图5示出了本公开实施例所提供的数据写入装置400中,第一写入模块420的具体示意图;图6示出了本公开实施例所提供的一种数据写入装置400的示意图之二。
如图4所示,所述数据写入装置400包括:
接收模块410,用于接收针对目标对象的数据写入请求,从所述数据写入请求中解析出所述目标对象对应的第一数据;
第一写入模块420,用于将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号;
判断模块430,用于判断缓存中是否存在与所述目标对象对应的第二数据,若存在所述第二数据,判断所述第二数据的版本号是否小于或等于所述第一数据的版本号;
第二写入模块440,用于若所述第二数据的版本号小于或等于所述第一数据的版本号,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
如图5所示,所述第一写入模块420包括:
判断单元421,用于在接收到所述数据写入请求时,判断所述持久化存储器中是否存在所述目标对象对应的第三数据;
写入单元422,用于若存在所述第三数据,则将所述第三数据替换成所述第一数据,写入所述持久化存储器中,基于所述第三数据的版本号生成所述第一数据的版本号。
如图5所示,所述写入单元422,还用于若不存在所述第三数据,则将所述第一数据写入所述持久化存储器中,并为所述第一数据分配预设版本号。
如图4所示,所述第二写入模块440,还用于:
若不存在所述第二数据,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
如图6所示,所述数据写入装置400还包括:
发送模块450,用于若所述第二数据的版本号大于所述第一数据的版本号,则向发送所述数据写入请求的请求端反馈所述第一数据写入失败的提示消息。
在本公开的实施例中,在接收到针对目标对象的第一数据的数据写入请求时,将第一数据写入持久化存储器中,并为写入持久化存储器中的第一数据分配版本号,进而,在判断出缓存中存在与目标对象对应的第二数据,则判断第二数据的版本号是否小于或等于第一数据的版本号,进一步地,若是,则将第一数据,以及第一数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第二数据的版本号小于或等于请求写入的第一数据的版本号时,才允许第一数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
实施例四
参照图7、图8所示,图7示出了本公开实施例所提供的一种数据读取装置700的示意图之一;图8示出了本公开实施例所提供的一种数据读取装置700的示意图之二。
如图7所示,第一判断模块710,用于接收针对目标对象的数据读取请求时,判断缓存中是否存在与所述目标对象对应的第一数据;
第一读取模块720,用于若不存在所述第一数据,从持久化存储器中读取所述目标对象对应的第二数据,以及所述第二数据的版本号;
第二判断模块730,用于判断所述缓存中是否存在与所述目标对象对应的第三数据,若存在所述第三数据,判断所述第三数据的版本号是否小于或等于所述第二数据的版本号;
写入模块740,用于若所述第三数据的版本号小于或等于所述第二数据的版本号,则将所述第二数据,以及所述第二数据的版本号写入所述缓存。
如图7所示,所述写入模块740,还用于:
若不存在所述第三数据,则将所述第二数据,以及所述第二数据写入所述缓存。
如图8所示,所述数据读取装置700还包括:
发送模块750,用于若所述第三数据的版本号大于所述第二数据的版本号,则向发送所述读取请求的请求端反馈所述第二数据写入失败的提示消息。
如图8所示,所述数据读取装置700还包括:
第二读取模块760,用于若存在所述第一数据,则从所述缓存中读取所述第一数据。
在本公开的实施例中,接收到针对目标对象的数据写入请求,将从数据写入请求中解析出目标对象对应的第一数据写入持久化存储器中,并为第一数据分配版本号,此时,再次判断缓存中是否存在与目标对象对应的第三数据,若存在,且第三数据的版本号小于或等于第二数据的版本号,则将第二数据,以及第二数据的版本号写入缓存。本公开为持久化存储器中存储的数据分配版本号,以及在当前缓存中的第三数据的版本号小于或等于请求写入的第二数据的版本号时,才允许第二数据写入缓存,即,只允许最新版本的数据写入缓存,这样,可以使缓存和持久化存储器中存储的数据保持一致,以便可以利用缓存来提升数据读取或写入的效率。
基于同一技术构思,本公开实施例还提供了一种计算机设备。参照图9所示,为本公开实施例提供的计算机设备900的结构示意图,包括处理器901、存储器902、和总线903。其中,存储器902用于存储执行指令,包括内存9021和外部存储器9022;这里的内存9021也称内存储器,用于暂时存放处理器901中的运算数据,以及与硬盘等外部存储器9022交换的数据,处理器901通过内存9021与外部存储器9022进行数据交换,当计算机设备900运行时,处理器901与存储器902之间通过总线903通信,使得处理器901在执行以下指令:
接收针对目标对象的数据写入请求,从所述数据写入请求中解析出所述目标对象对应的第一数据;
将所述第一数据写入持久化存储器中,并为所述第一数据分配版本号;
判断缓存中是否存在与所述目标对象对应的第二数据,若存在所述第二数据,判断所述第二数据的版本号是否小于或等于所述第一数据的版本号;
若所述第二数据的版本号小于或等于所述第一数据的版本号,则将所述第一数据,以及所述第一数据的版本号关联写入所述缓存。
处理器901还可以执行以下指令:
接收针对目标对象的数据读取请求时,判断缓存中是否存在与所述目标对象对应的第一数据;
若不存在所述第一数据,从持久化存储器中读取所述目标对象对应的第二数据,以及所述第二数据的版本号;
判断所述缓存中是否存在与所述目标对象对应的第三数据,若存在所述第三数据,判断所述第三数据的版本号是否小于或等于所述第二数据的版本号;
若所述第三数据的版本号小于或等于所述第二数据的版本号,则将所述第二数据,以及所述第二数据的版本号写入所述缓存。
实施例五
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的数据写入方法的步骤,和/或执行上述方法实施例中所述的数据读取方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例所提供的数据写入方法、数据读取方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的数据写入方法、数据读取方法的步骤,具体可参见上述方法实施例,在此不再赘述。
本公开实施例还提供一种计算机程序,该计算机程序被处理器执行时实现前述实施例的任意一种方法。该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software DevelopmentKit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。