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