数据查询方法、装置、服务器及存储介质与流程

文档序号:19879322发布日期:2020-02-08 06:48阅读:180来源:国知局
数据查询方法、装置、服务器及存储介质与流程

本公开涉及存储技术领域,尤其涉及一种数据查询方法、装置、服务器及存储介质。



背景技术:

为了提高数据的查询速度,可以将数据库中的数据存储在缓存(英文:cache)中,当客户端请求查询数据库中的某一数据时,可以先访问缓存,如果缓存中已经存储了数据,则从缓存中读取数据的值,将数据的值返回给客户端,如果缓存中没有存储数据,再从数据库中读取数据的值,那么由于缓存的访问速度快于数据库的访问速度,能够加快查询到数据的值。

目前,通常采用键值对的形式,将待缓存的所有数据均存储在缓存中。具体地,如果数据为非空值数据,则服务器会以数据的身份标识号(英文:identification,简称:id)为键(英文:key),以数据的值为值(英文:value),为该数据在缓存中存储键值对;如果数据为空值数据,则以数据的id为键,以0为值,为该数据在缓存中存储键值对。当终端要查询目标数据的值,触发了查询请求时,服务器会确定该目标数据的键,根据目标数据的键查询缓存。如果缓存中包括数据的键,则查询缓存中该键对应的值,作为目标数据的值。如果缓存中不包括数据的键,则服务器确定该数据没有被缓存,会回源数据库,从数据库读取该数据的值。

以缓存评论的点赞数量为例,如果要缓存3条评论的点赞数量,其中id为001的评论的点赞数量为5,id为002的评论的点赞数量为0,id为003的评论的点赞数量为0,则服务器会在缓存中存储3个键值对,评论1的键值对为key:001,value:5,评论2的键值对为key:002,value:0,评论3的键值对为key:003,value:0。当要查询id是002的评论的点赞数量时,服务器会以002为key,查询缓存,得到value为0;当要查询id是006的评论的点赞数量时,服务器会以006为key,查询缓存,发现缓存中不包括以006为key的评论,则确定id是006的评论没有被缓存,则回源数据库,以006为key查询数据库,从而从数据库中读取id是006的评论的点赞数量。

采用上述方法时,要将空值数据的key和value也存储在缓存中,才能在查询缓存后,确定待查询的目标数据是否是空值数据,这就导致空值数据会在缓存占用很多的存储空间,造成缓存中存储空间的浪费。



技术实现要素:

本公开提供一种数据查询方法、装置、服务器及存储介质,以至少解决相关技术中浪费缓存中存储空间的技术问题。本公开的技术方案如下:

根据本公开实施例的第一方面,提供一种数据查询方法,包括:

接收查询请求,所述查询请求用于查询目标数据的值;

查询缓存中所述目标数据对应的压缩数据集合,所述压缩数据集合包括第一数组以及第二数组,所述第一数组用于存储非空值数据的索引,所述第二数组用于存储所述非空值数据的值;

如果所述第一数组包括所述目标数据的索引,从所述第二数组查询所述目标数据的值;

如果所述第一数组不包括所述目标数据的索引,确定所述目标数据为空值数据。

可选地,所述从所述第二数组查询所述目标数据的值,包括:

确定所述目标数据的索引在第一数组中所处的位置;

根据所述索引在所述第一数组中所处的位置,查询所述第二数组中所述位置存储的值,作为所述目标数据的值。

可选地,所述第一数组中的所述非空值数据的索引按照从小到大的顺序依次排列;或者,所述第一数组中的所述非空值数据的索引按照从大到小的顺序依次排列;

所述确定所述目标数据的索引在第一数组中所处的位置,包括:

基于二分查找法,从所述第一数组查询所述目标数据的索引,得到所述索引在所述第一数组中所处的位置。

可选地,所述确定所述目标数据的索引在第一数组中所处的位置之前,所述方法还包括:

读取所述目标数据的标识中第一数位上的取值,作为所述目标数据的索引。

可选地,所述查询缓存中所述目标数据对应的压缩数据集合,包括:

读取所述目标数据的标识中第二数位上的取值;

根据所述第二数位上的取值,从所述缓存中查询所述压缩数据集合。

可选地,所述接收查询请求之后,所述方法还包括:

如果所述缓存不包括所述压缩数据集合,将所述目标数据的标识归一化为所述压缩数据集合对应的预设标识;

根据所述预设标识,从数据库读取所述目标数据。

可选地,所述根据所述预设标识,从数据库读取所述目标数据,包括:

根据所述目标数据的标识,确定所述数据库中所述目标数据所在的目标表;

从所述目标表中,读取所述目标数据以及所述压缩数据集合中所述目标数据之外的其他数据。

可选地,所述压缩数据集合存储的每个数据的标识的尾号均相同,所述根据所述目标数据的标识,确定所述数据库中所述目标数据所在的目标表,包括:

对所述目标数据的标识的尾号取模,得到模值;

确定所述数据库中标识为所述模值的表,作为所述目标表。

可选地,所述查询缓存中所述目标数据对应的压缩数据集合之后,所述方法还包括:

如果所述第一数组为空,查询所述第二数组中所述索引对应的位置存储的值,作为所述目标数据的值。

可选地,所述接收查询请求之前,所述方法还包括:

获取待缓存的至少一个数据;

根据所述至少一个数据中的非空值数据,生成所述压缩数据集合;

将所述压缩数据集合存储至缓存中。

可选地,所述根据所述至少一个数据中的非空值数据,生成所述压缩数据集合,包括:

如果所述非空值数据的数量小于或等于数量阈值,将所述非空值数据的索引存储至所述第一数组,将所述非空值数据的值存储至所述第二数组;

如果所述非空值数据的数量大于所述数量阈值,将所述第一数组配置为空,将所述至少一个数据中每个数据的值存储至所述第二数组。

根据本公开实施例的第二方面,提供一种数据查询装置,包括:

接收单元,被配置为执行接收查询请求,所述查询请求用于查询目标数据的值;

查询单元,被配置为执行查询缓存中所述目标数据对应的压缩数据集合,所述压缩数据集合包括第一数组以及第二数组,所述第一数组用于存储非空值数据的索引,所述第二数组用于存储所述非空值数据的值;

所述查询单元,还被配置为执行如果所述第一数组包括所述目标数据的索引,从所述第二数组查询所述目标数据的值;

确定单元,被配置为执行如果所述第一数组不包括所述目标数据的索引,确定所述目标数据为空值数据。

可选地,所述查询单元,被配置为执行:确定所述目标数据的索引在第一数组中所处的位置;根据所述索引在所述第一数组中所处的位置,查询所述第二数组中所述位置存储的值,作为所述目标数据的值。

可选地,所述第一数组中的所述非空值数据的索引按照从小到大的顺序依次排列;或者,所述第一数组中的所述非空值数据的索引按照从大到小的顺序依次排列;

所述确定单元,被配置为执行:基于二分查找法,从所述第一数组查询所述目标数据的索引,得到所述索引在所述第一数组中所处的位置。

可选地,所述装置还包括:

读取单元,被配置为执行读取所述目标数据的标识中第一数位上的取值,作为所述目标数据的索引。

可选地,所述查询单元,包括:

读取子单元,被配置为执行读取所述目标数据的标识中第二数位上的取值;

查询子单元,被配置为执行根据所述第二数位上的取值,从所述缓存中查询所述压缩数据集合。

可选地,所述装置还包括:

归一化单元,被配置为执行如果所述缓存不包括所述压缩数据集合,将所述目标数据的标识归一化为所述压缩数据集合对应的预设标识;

读取单元,被配置为执行根据所述预设标识,从数据库读取所述目标数据。

可选地,所述读取单元,包括:

确定子单元,被配置为执行根据所述目标数据的标识,确定所述数据库中所述目标数据所在的目标表;

读取子单元,被配置为执行从所述目标表中,读取所述目标数据以及所述压缩数据集合中所述目标数据之外的其他数据。

可选地,所述压缩数据集合存储的每个数据的标识的尾号均相同,所述确定子单元,被配置为执行:对所述目标数据的标识的尾号取模,得到模值;确定所述数据库中标识为所述模值的表,作为所述目标表。

可选地,所述查询单元,还被配置为执行:如果所述第一数组为空,查询所述第二数组中所述索引对应的位置存储的值,作为所述目标数据的值。

可选地,所述装置还包括:

获取单元,被配置为执行获取待缓存的至少一个数据;

生成单元,被配置为执行根据所述至少一个数据中的非空值数据,生成所述压缩数据集合;

存储单元,被配置为执行将所述压缩数据集合存储至缓存中。

可选地,所述生成单元,被配置为执行:如果所述非空值数据的数量小于或等于数量阈值,将所述非空值数据的索引存储至所述第一数组,将所述非空值数据的值存储至所述第二数组;如果所述非空值数据的数量大于所述数量阈值,将所述第一数组配置为空,将所述至少一个数据中每个数据的值存储至所述第二数组。

根据本公开实施例的第三方面,提供一种服务器,包括:

一个或多个处理器;

用于存储所述一个或多个处理器可执行指令的一个或多个存储器;

其中,所述一个或多个处理器被配置为执行所述指令,以实现上述数据查询方法。

根据本公开实施例的第四方面,提供一种存储介质,当所述存储介质中的指令由服务器的处理器执行时,使得所述服务器能够执行上述数据查询方法。

根据本公开实施例的第五方面,提供一种计算机程序产品,包括一条或多条指令,所述一条或多条指令由服务器的处理器执行时,使得所述服务器能够执行上述数据查询方法。

本公开的实施例提供的技术方案至少带来以下有益效果:

本公开实施例提供了一种新的数据结构,通过以压缩数据集合的形式来存储和查询数据,该压缩数据集合使用两个数组,来分别存储非空值数据的索引以及非空值数据的值,当要查询目标数据的值时,如果从第一数组中找到所述目标数据的索引,能够确定目标数据是非空值数据,进而从所述第二数组找到所述目标数据的值,如果发现第一数组不包括所述目标数据的索引,能够确定目标数据是空值数据。一方面,能够保证在查询缓存后,确定待查询的目标数据是否是空值数据,并找到非空值数据的值,从而免去回源数据库的流程,解决了缓存穿透的问题,另一方面,压缩数据集合通过免去了空值数据的键以及空值数据的值占用的存储空间,从而实现了压缩存储数据的功能,通过节省了空值数据在缓存中占用的空间,节省了缓存资源。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。

图1是根据一示例性实施例示出的一种数据查询系统的结构框图;

图2是根据一示例性实施例示出的一种数据查询方法的流程图;

图3是根据一示例性实施例示出的一种数据查询方法的流程图;

图4是根据一示例性实施例示出的一种数据查询装置的框图;

图5是根据一示例性实施例示出的一种服务器的框图。

具体实施方式

为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。

需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。

本公开所涉及的数据可以为经用户授权或者经过各方充分授权的数据。

以下,对本公开涉及的一些术语进行解释:

回源读取:当终端请求查询某一数据时,通常会先访问缓存,从缓存中查询数据的值,如果缓存中存在该数据,则从缓存中读取该数据的值,将数据的值返回给终端,而如果缓存中不存在该数据,则会回源数据库,向数据库发送查询请求,从数据库中读取该数据的值,这种情况称为回源读取。通常来讲,从数据库读取数据后,可以将数据的值重新存储至缓存中,以便下次终端请求查询该数据时,可以从缓存中得到数据的值,免去回源数据库的流程。

缓存(cache)穿透:如果数据库中没有存储数据的值,即数据是空值数据时,每次终端请求查询数据的值时,会出现缓存未命中,然后回源数据库的情况,这种情况称为缓存穿透。例如,在评论点赞的场景中,当终端请求查看评论列表时,服务器会查询评论列表中每条评论的点赞数量。通常情况下,数据库在存储每条评论的点赞数量时,如果某条评论的点赞数量为0,数据库并不会记录这条评论的点赞数量,导致这条评论的点赞数量是空值,因此服务器在查询这条评论的点赞数量时,会出现缓存未命中,然后回源数据库的情况,当回源数据库后,服务器可以确定数据库中这条评论的点赞数量为空值,则向终端返回点赞数量为0。由于评论的点赞数量通常具有稀疏的性质,即,被点赞的评论只占少部分,而大部分评论的点赞数量通常为0,导致数据库会存在大量的空值数据,造成频繁发生缓存穿透的情况。

以下,结合示例性应用场景对本公开的效果进行介绍。

相关技术中,为了解决缓存穿透的问题,通常会以空值数据的id为键,以0为值,将每个空值数据以一个键值对的形式,在缓存中存储空值数据。例如,如果数据库中没有存储某条评论的点赞数量,则将0作为这条评论的点赞数量,在缓存中存储评论id以及0组成的键值对。采用该方法时,由于以键值对的形式缓存了空值数据,会导致空值数据也占用了缓存中的存储空间,造成存储空间的浪费。尤其是,如果待缓存的数据量巨大并且数据具有稀疏的特性时,例如在评论点赞的场景中,当某条信息的评论数量达到了百亿量级时,这百亿量级的评论中被点赞过的评论的数量可能只有亿级别,也就是说,未被点赞过的评论可以达到十亿量级甚至百亿量级,对于这种明显具有稀疏特性的数据而言,如果还采用这种方式存储,显然要耗费巨大的缓存空间。

而在本公开实施例中,采用了一种新的压缩的数据结构来存储数据,该压缩的数据结构为一个压缩数据集合,通过两个数组来分别存储非空值数据的索引和值。一方面,通过免去了空值数据占用的存储空间,从而节省了缓存的存储空间,例如,如果要缓存百亿量级的评论的点赞数量时,将其中被点赞过的评论的点赞数量存储在压缩数据集合即可,从而节省了没有被点赞过的评论原本会占用的存储空间。另一方面,当终端请求查询某一数据时,如果从压缩数据集合未查询到数据的索引,即可直接确定数据为空值数据,从而免去了回源数据库的流程,解决了缓存穿透的问题。例如,如果某条评论没有被点赞过,而终端当前请求查询该评论的点赞数量时,服务器找到该评论所在的压缩数据集合后,当发现该压缩数据集合未存储该评论的索引时,即可确定该评论是空值数据,向终端返回点赞数量为0,而无需回源数据库来继续查询该评论的点赞数量。此外,本公开还为数据的标识设计了新的格式,通过将数据的标识的尾号预留出来,将尾号与数据在数据库中所在的表相互关联,来保证同一压缩数据集合的所有数据缓存在数据库的同一表中,从而减少回源数据库的性能开销。此外,本公开还通过在回源数据库时,将同一压缩数据集合中的数据的索引归一化,来解决了同时为多个数据回源数据库时可能出现的重复读取问题,从而进一步减少了回源数据库的性能开销。

以下,对本公开实施例的系统架构进行介绍。

图1是根据一示例性实施例示出的一种数据查询系统的结构框图。该数据查询系统包括:终端101、服务器102、缓存103以及数据库104。终端101、服务器102、缓存103以及数据库104之间通过无线网络或有线网络相连,终端101、服务器102、缓存103以及数据库104之间可以通过网络进行通信。

终端101可以是智能手机、游戏主机、台式计算机、平板电脑、电子书阅读器、mp3(movingpictureexpertsgroupaudiolayeriii,动态影像专家压缩标准音频层面3)播放器或mp4(movingpictureexpertsgroupaudiolayeriv,动态影像专家压缩标准音频层面4)播放器和膝上型便携计算机中的至少一种。终端101安装和运行有支持数据存储或者数据查询的应用程序,该应用程序可以称为存储客户端,该应用程序可以是直播应用、多媒体应用、短视频应用、内容分享应用等。示例性的,终端101是用户使用的终端,终端101中运行的应用程序内登录有用户账号。

服务器102包括一台服务器、多台服务器、云计算平台和虚拟化中心中的至少一种。服务器102用于为终端安装的应用程序提供后台服务。

缓存103可以是cache,为一种高速存储器。

在存储数据的过程中,终端101、服务器102、缓存103以及数据库104可以进行交互。作为示例,终端101可以提供数据,将数据发送给服务器102,服务器102可以将数据存储至缓存103以及数据库104。当终端101要查询数据时,可以生成查询指令,将查询指令发送给服务器102,服务器可以响应查询指令,访问缓存103,从缓存103查询数据,如果从缓存103读取到数据的值,则将数据的值返回给终端101,如果未从缓存103读取到数据的值,则回源数据库104,从数据库104读取数据的值,将数据的值返回给终端101。

本领域技术人员可以知晓,终端101、服务器102、缓存103以及数据库104的数量均可以更多或更少。比如终端101、服务器102、缓存103以及数据库104可以仅为一个,或者终端101、服务器102、缓存103以及数据库104为几十个或几百个,或者更多数量,此时上述数据查询系统还包括其他终端、其他服务器、其他缓存或其他数据库。本公开实施例对终端、服务器、缓存以及数据库的数量和设备类型不加以限定。

以下,对本公开实施例的方法流程进行介绍。

图2是根据一示例性实施例示出的一种数据查询方法的流程图,如图2所示,该方法用于服务器中,包括以下步骤。

在步骤s21中,接收查询请求,该查询请求用于查询目标数据的值。

在步骤s22中,查询缓存中该目标数据对应的压缩数据集合,该压缩数据集合包括第一数组以及第二数组,该第一数组用于存储非空值数据的索引,该第二数组用于存储该非空值数据的值。

在步骤s23中,如果该第一数组包括该目标数据的索引,从该第二数组查询该目标数据的值。

在步骤s24中,如果该第一数组不包括该目标数据的索引,确定该目标数据为空值数据。

图3是根据一示例性实施例示出的一种数据查询方法的流程图,如图3所示,该方法用于服务器中,包括以下步骤。

在步骤s31中,服务器获取待缓存的至少一个数据。

待缓存的数据可以是非空值数据,也可以是空值数据。非空值数据的值为除了空值之外的值,空值数据的值为空值。其中,空值是指值为未知,也就是说,数据库中没有存储数据的值。可选地,数据的类型可以是long类型,即长整型,当然,数据的类型也可以是结构化的复杂类型或者其他类型,本实施例对数据的类型不做限定。以缓存评论的点赞数量为例,待缓存的至少一个数据可以是100条评论的点赞数量,例如数据可以是:id为“12345600001”的评论的点赞数量为10;id为“12345600002”的评论的点赞数量为0,等等。其中,如果某条评论的点赞数量为0,数据库通常不会存储这条评论的点赞数量,因此在这个例子中,空值数据是指点赞数量为0的评论。

每个数据可以具有对应的标识。数据的标识用于标识对应的数据,例如可以是数据的id。可选地,待缓存的至少一个数据中不同数据的标识中第一数位上的取值可以互不相同,而待缓存的至少一个数据中不同数据的标识中第二数位上的取值均相同。其中,第一数位和第二数位为不同的数位,第一数位可以包括一个或多个数位,第一数位上的取值可以作为数据的索引。第二数位可以包括一个或多个数位,第二数位上的取值可以指示数据库中数据所在的表。例如,第一数位可以是千位和万位,第二数位可以是千位和万位之外的其他数位,则数据的标识会满足这样的格式:xxxx??xxx,其中x为预设取值,?为数据的索引。以一次存储100条数据为例,这100条数据的标识可以分别是(xxxx00xxx,xxxx01xxx,xxxx02xxx...xxxx99xxx),其中,100条数据的标识中千位和万位上的取值依次为00至99,而100条数据的标识中千位和万位之外的其他数位上的取值均相等。以其他数位上的取值为123456__001为例,100条数据的标识分可以分别是(12345600001,12345601001,12345602001...12345699001)。

在步骤s32中,服务器根据该至少一个数据中的非空值数据,生成压缩数据集合。

对于至少一个数据中的每个数据,服务器可以判断该数据的值是否为空值,如果该数据的值是空值,则确定该数据为空值数据,如果该数据的值不是空值,则确定该数据为非空值数据。服务器根据待缓存的数据中的非空值数据,可以生成压缩数据集合,从而通过压缩数据集合,来缓存该至少一个数据。

压缩数据集合是本实施例提供的用于在缓存中存储数据的数据结构,压缩数据集合可以视为一个数据桶。可选地,压缩数据集合可以用于存储预设数量的数据,该预设数量可以根据实验、经验或需求设置。示例性地,该预设数量可以为100,那么在缓存数据的过程中,可以按照每100个数据为一个数据桶的方式来组织数据。压缩数据集合在程序中可以记为compresscachevalue(意为压缩缓存值)。压缩数据集合可以包括两个数组,为了区分描述,在此分别称为第一数组以及第二数组。

第一数组用于存储非空值数据的索引,具体地,第一数组可以包括至少一个位置,每个位置用于存储一个非空值数据的索引。可选地,第一数组在程序中可以记录为bucket_index,第一数组的每个位置可以用于存储一个32位无符号的整型数据。

在一些实施例中,第一数组可以存储有多个非空值数据的索引,第一数组中非空值数据的索引可以按照从小到大的顺序依次排列,即,第一数组存储的索引满足升序排列的规律。在另一些实施例中,第一数组中的非空值数据的索引可以按照从大到小的顺序依次排列,即,第一数组存储的索引满足降序排列的规律。

索引用于在第二数组中查询对应数据的值,索引可以是数据的值在第二数组中的位置下标。在一些实施例中,数据的索引可以和数据的标识关联,根据数据的标识,可以确定出该数据的索引。作为一种可能的实现,数据的索引可以是数据的标识中第一数位上的取值。例如,如果第一数位是千位和万位,数据的id是12345601001,该id的千位和万位上的取值是01,则该数据的索引为01。

第二数组用于存储该非空值数据的值,具体地,第二数组可以包括至少一个位置,每个位置用于存储一个非空值数据的值。例如,第二数组可以用于存储一批评论的点赞数量,第二数组中的每个位置存储一条评论的点赞数量。可选地,第二数组在程序中可以记录为value(意为值),第二数组的每个位置可以用于存储一个64位无符号的整型数据。第二数组的每个位置可以和第一数组的每个位置一一对应,第一数组中任一位置存储的索引可以指向第二数组中对应位置存储的值。例如,如果任一数据的索引在第一数组中存储于第i个位置,则该数据的值可以也存储在第二数组中的第i个位置,其中,i为0或正整数,第一数组的起始位置为第0个位置,第二数组的起始位置为第0个位置。

可选地,在一些实施例中,可以使用protobuf(protobuf是谷歌开发的用于高效存储和读取结构化数据的工具),来定义压缩数据集合。示例性地,压缩数据集合可以通过以下程序代码来定义:

messagecompresscachevalue{

repeateduint32bucket_index=1;

repeateduint64value=2;

上述程序代码的含义为:定义了一种数据结构,名称为compresscachevalue,该数据结构包含两个属性字段,一个属性字段的名称为bucket_index,bucket_index为用于存储32位无符号整型数据的数组,另一个属性字段的名称是value,value为用于存储64位无符号整型的数组。

在一个示例性场景中,如果要通过压缩数据集合缓存100条评论的点赞数量,这100条评论的id分别是(12345600001,12345601001,12345602001...12345699001),这100条评论中有6条评论为非空值数据,分别是:id为123456_00_001的评论,其点赞数量为10;id为123456_01_001的评论,其点赞数量为20;id为123456_02_001的评论,其点赞数量为15;id为123456_16_001的评论,其点赞数量为89;id为123456_52_001的评论,其点赞数量为198;id为123456_99_001的评论,其点赞数量为2500,剩余的94条评论是空值数据,其点赞数量均是0。在这个例子中,可以取id的千位和万位上的取值作为评论的点赞数量的索引,则id为123456_00_001的评论的索引是0,id为123456_01_001的评论的索引是1,id为123456_02_001的评论的索引是2,id为123456_16_001的评论的索引是16,id为123456_52_001的评论的索引是52,id为123456_99_001的评论的索引是99。如果第一数组中的索引按照从小到大的顺序依次排列,由于这6条非空值数据的索引按照从小到大的顺序依次是0,1,2,16,52,99,与该顺序对应,这6条非空值数据的值分别是10,20,15,89,198,2500,则第一数组为[0,1,2,16,52,99],第二数组为[10,20,15,89,198,2500];另外,如果第一数组中的索引按照从大到小的顺序依次排列,这6条非空值数据的索引按照从大到小的顺序依次是99,52,16,2,1,0,与该顺序对应,这6条非空值数据的值分别是2500,198,89,15,20,10,则第一数组为[99,52,16,2,1,0],第二数组为[2500,198,89,15,20,10]。

相关技术中,100条评论的点赞数量会通过100个键值对在缓存中存储,键值对中的键和值会分别在缓存中占用1个存储位置,则每个键值对会占用2个存储位置,因此100个键值对会占用200个存储位置。而本实施例中,通过上述例子可以看出,通过采用压缩数据集合,利用第一数组的6个元素以及第二数组的6个元素,就能够表达出100条评论中每条评论的点赞数量,因此缓存6条非空值评论的点赞数量即可,免去了94条空值评论的点赞数量所占用的存储空间。100条评论的点赞数量在缓存中占用了12个存储位置,节省了(200-12)=188个存储位置,由此可见,能够极大地节省缓存的存储空间,提高缓存的利用率。

在另一个示例性场景中,如果100条评论中有2条评论为非空值数据,分别是:id为123456_00_001的评论,其点赞数量为10;id为123456_99_001的评论,其点赞数量为20,剩余的98条评论是空值数据,其点赞数量均是0。在这个例子中,可以取id的千位和万位上的取值作为评论的点赞数量的索引,则id为123456_00_001的评论的索引是0,id为123456_99_001的评论的索引是99。如果第一数组中的索引按照从小到大的顺序依次排列,由于这2条非空值数据的索引按照从小到大的顺序依次是0,99,与该顺序对应,这2条非空值数据的值分别是10,20,则第一数组可以为[0,99],第二数组为[10,20]。通过上述例子可以看出,通过采用压缩数据集合,利用第一数组的2个元素以及第二数组的2个元素,就能够表达出100条评论中每条评论的点赞数量,因此缓存2条非空值评论的点赞数量即可,免去了98条空值评论的点赞数量所占用的存储空间。100条评论的点赞数量在缓存中占用了4个存储位置,节省了(200-4)=196个存储位置,由此可见,能够极大地节省缓存的存储空间,提高缓存的利用率。

在一些实施例中,服务器可以结合当前待缓存的数据的稀疏程度,以不同的方式,使用压缩数据集合缓存数据。作为示例,压缩数据集合的生成过程可以包括下述步骤一至步骤四:

步骤一、服务器确定待缓存的至少一个数据中非空值数据的数量。

步骤二、服务器对非空值数据的数量与数量阈值进行比较。

数量阈值可以根据实验、经验或业务需求设置。经过实验分析,当数量阈值为数据量的一半左右时,数据在缓存中占用的空间最小,因此可以将待缓存的数据的总数量的一半作为数量阈值,从而最大程度的节省存储空间。作为示例,如果每个压缩数据集合用于缓存100条数据,则数量阈值可以是48。

服务器可以根据非空值数据的数量与数量阈值的大小关系,来确定执行下述步骤三来缓存数据,还是执行下述步骤四来缓存数据。以每个压缩数据集合缓存100条数据,数据为评论的点赞数量,数量阈值为48为例,服务器得到100条评论后,可以确定这100条评论中被点赞过的评论的数量,如果被点赞过的评论的数量小于或等于48条,则执行下述步骤三来缓存这100条评论的点赞数量,如果被点赞过的评论的数量大于48条,则执行下述步骤四来缓存这100条评论的点赞数量。

步骤三、如果该非空值数据的数量小于或等于数量阈值,服务器将该非空值数据的索引存储至该第一数组,将该非空值数据的值存储至该第二数组。

在一些实施例中,服务器可以对非空值数据的索引按照从小到大的顺序进行排序,或者对非空值数据的索引按照从大到小的顺序进行排序,将排序后的索引存储至第一数组;此外,服务器可以根据索引的排序结果,对非空值数据的值进行排序,将排序后的值存储至第二数组。例如,如果某条非空值数据的索引在所有索引中排在第i位,则可以将该非空值数据的值在所有值中排在第i位。

此外,对于待缓存的数据中剩余的空值数据而言,服务器可以丢弃该空值数据,从而免去空值数据占用的缓存空间。另外,如果待缓存的每个数据均是空值数据,则服务器可以将第一数组配置为空,将第二数组也配置为空。

通过以步骤三的方式,使用压缩数据集合来缓存数据,可以同时从key和value两个维度来节省缓存空间。具体地,第一数组存储非空值数据的索引即可,无需存储空值数据的索引,从而免去了空值数据的key会占用的存储空间,节省了key的存储空间需求。同理地,第二数组存储非空值数据的值即可,无需为空值数据存储0,从而免去了空值数据的value会占用的存储空间,节省了value的存储空间需求。作为示例,如果待缓存的n个数据中有m个数据是非空值数据,则第一数组的长度可以是m,第一数组存储有m个索引,如此,可以节省(n-m)个空值数据的key占用的存储空间。第二数组的长度可以是m,第二数组存储有m个值,如此,可以节省(n-m)个空值数据的值占用的存储空间。其中,n和m为正整数,m小于或等于n。

步骤四、如果该非空值数据的数量大于该数量阈值,服务器将该第一数组配置为空,将该至少一个数据中每个数据的值存储至该第二数组。

与上述步骤三所示的压缩数据集合的使用方式区别的是,如果执行步骤四来缓存数据,第二数组在存储非空值数据的值的基础上,还会存储空值数据的值,例如,如果数据是空值数据,可以将0作为该数据的值,在第二数组中该数据对应的位置存储0。在这种使用方式下,如果待缓存n个数据,则第二数组的长度可以是n,第二数组存储有n个值,n为正整数。

在一些实施例中,第二数组的每个位置可以和数据的索引一一对应,第二数组中的第i个位置可以用于存储索引为i的数据。以缓存评论的点赞数量,索引为评论id的千位和万位上的取值为例,如果评论的id为12345600001,则该评论的索引为00,可以将该评论的点赞数量存储在第二数组的第0个位置;如果评论的id为12345601001,则该评论的索引为01,可以将该评论的点赞数量存储在第二数组的第1个位置,依次类推,如果评论的id为12345699001,则该评论的索引为99,可以将该评论的点赞数量存储在第二数组的第99个位置。其中,如果某条评论的点赞数量为0,该评论的索引为i,可以将0存储在第二数组中第i个位置。

例如,如果每个压缩数据集合缓存100条评论的点赞数量,则第二数组可以是大小固定为100的数组,第二数组的第0个位置至第99个位置依次存储id的千位和万位为00至99的评论的点赞数量。作为示例,如果100条评论的id分别是(12345600001,12345601001,12345602001...12345699001),其中有2条评论为非空值数据,分别是id为12345600001的评论,其点赞数量为10,id为12345699001的评论,其点赞数量为20,剩余的98条评论为空值数据,点赞数量均为0,则第二数组为[10,0,0,0,…20],该数组中第0个位置和第99个位置有值,而其他的位置存储的均是0。

通过以步骤四的方式,使用压缩数据集合来缓存数据,可以从key的维度来节省缓存空间。具体地,压缩数据集合存储数据的值即可,无需存储数据的索引,从而免去了非空值数据的key以及空值数据的key会占用的存储空间,从而节省了key的存储空间需求。作为示例,如果待缓存n个数据,当通过压缩数据集合缓存数据时,通过第二数组来存储n个值即可,从而节省n个key占用的存储空间。

通过依据当下待缓存的数据中非空值数据的数量,从上述两种使用方式中选择合适的使用方式来缓存数据,一方面提高了存储数据的灵活性,保证数据的缓存方式与数据的稀疏情况匹配,另一方面保证消耗的内存尽可能少,提高存储空间的利用率。

在一些实施例中,步骤三提供的使用方式以及步骤四提供的使用方式可以通过第一数组是否为空来进行区分。具体地,如果数据所在的压缩数据集合中的第一数组不为空,则可以确定数据是通过上述步骤三提供的使用方式存储在压缩数据集合中的,如果数据所在的压缩数据集合中的第一数组为空,则可以确定数据是通过上述步骤四提供的使用方式存储在压缩数据集合中的。以第一数组记录为bucket_index为例,如果压缩数据集合中bucket_index数组非空,则确定该压缩数据集合采用了步骤三提供的使用方式,如果压缩数据集合中bucket_index数组为空,则确定该压缩数据集合采用了步骤四提供的使用方式。

在步骤s33中,服务器将该压缩数据集合存储至缓存中。

在一些实施例中,服务器可以和缓存通过网络连接,服务器可以将压缩数据集合通过网络存储至缓存中。可选地,服务器可以为压缩数据集合确定对应的键,将压缩数据集合与压缩数据集合的键进行关联存储,以便在后续查询数据时,可以通过压缩数据集合的键,从缓存中找到压缩数据集合。

压缩数据集合的键(key)可以根据压缩数据集合中数据的标识确定。作为示例,可以根据压缩数据集合存储的数据的标识的第二数位上的取值,获取压缩数据集合的键。以第二数位是千位和万位之外的其他数位为例,可以将数据的id的千位和万位替换为下划线“_”,将替换结果作为压缩数据集合的键。

其中,对于同一压缩数据集合而言,该压缩数据集合中的每条数据的标识的第二数位上的取值可以均相同,因此根据该压缩数据集合中的任一条数据,可以确定出相同的压缩数据集合的键。示例性地,以压缩数据集合存储100条数据,第二数位是千位和万位之外的其他数位为例,这100条数据的id可以分别是(12345600001,12345601001,12345602001...12345699001),从这个例子可以看出,这100条数据中第二数位上的取值均相同,均是123456001,因此根据这100条数据中的任一条数据,均可以得到压缩数据集合的键为123456_001。又例如,如果压缩数据集合存储的数据的id分别是(0,1000,2000...99000),则压缩数据集合的键可以是0_0;如果压缩数据集合存储的数据的id分别是(1,1001,2001...99001),则压缩数据集合的键可以是0_1;如果压缩数据集合存储的数据的id分别是(999,1999,2999...99999),则压缩数据集合的键可以是0_999。

在步骤s34中,服务器接收查询请求,该查询请求用于查询目标数据的值。

目标数据是指待查询的数据,查询请求可以包括目标数据的标识,查询请求可以由终端生成并发送给服务器。在一个示例性场景中,如果用户要查询某条评论的点赞数量,可以在终端上触发操作,终端可以根据该评论的标识,生成查询请求,将查询请求发送给服务器。

在步骤s35中,服务器查询缓存中该目标数据对应的压缩数据集合。

服务器可以读取该目标数据的标识中第二数位上的取值,根据该第二数位上的取值,从该缓存中查询该压缩数据集合。具体地,服务器可以根据该第二数位上的取值,获取压缩数据集合的键,查询缓存中该键对应的压缩数据集合。以第二数位为千位和万位之外的其他位为例,如果目标数据的id是12345600001,该id的千位和万位是00,将该id的千位和万位替换为“_”,得到123456_001,则可以确定存储目标数据的压缩数据集合的键是123456_001,可以根据123456_001,找到压缩数据集合。

在步骤s36中,服务器判断压缩数据集合的第一数组是否为空,如果压缩数据集合的第一数组非空,执行步骤s37或步骤s38,如果压缩数据集合的第一数组为空,执行步骤s39。

由于压缩数据集合包括两种使用方式,服务器可以通过判断第一数组是否为空,来确定目标数据对应的压缩数据集合是使用了两种使用方式中的哪一种使用方式,以便执行使用方式对应的查询方式。具体地,如果第一数组非空,可以确定目标数据对应的压缩数据集合采用了步骤s32中步骤三提供的使用方式,因此可以判断第一数组是否包括该目标数据的索引,如果第一数组包括目标数据的索引,可以确定目标数据是非空值数据,则执行步骤s37,如果第一数组不包括目标数据的索引,可以确定目标数据是空值数据,执行步骤s38,如果第一数组为空,则确定数据对应的压缩数据集合采用了步骤s32中步骤四提供的使用方式,则执行步骤s39。

在步骤s37中,如果该第一数组包括该目标数据的索引,服务器从该第二数组查询该目标数据的值。

在一些实施例中,步骤s37可以包括下述步骤一至步骤三。

步骤一、服务器获取目标数据的索引。

其中,服务器可以读取该目标数据的标识中第一数位上的取值,作为该目标数据的索引。以第一数位为千位和万位之外为例,如果目标数据的id是12345600001,该id的千位和万位是00,则服务器可以确定目标数据的索引是00。

步骤二、服务器确定该目标数据的索引在第一数组中所处的位置。

在一些实施例中,如果第一数组中的非空值数据的索引按照从小到大的顺序依次排列,或者按照从大到小的顺序依次排列,服务器可以基于二分查找法,从该第一数组查询该目标数据的索引,得到该索引在该第一数组中所处的位置。

针对二分查找的具体流程,服务器可以确定第一数组的中间元素,以该中间元素为区间端点,将第一数组的第一个元素至该中间元素作为左半区间,将该中间元素至第一数组的最后一个元素作为右半区间;将目标数据的索引与该中间元素进行比较,如果目标数据的索引小于该中间元素,则确定目标数据的索引落在左半区间,继续确定左半区间的中间元素,将目标数据的索引与左半区间的中间元素进行比较,以此类推,直到查找到目标数据的索引为止;同理地,如果目标数据的索引大于中间元素,则确定目标数据的索引落在右半区间,继续确定右半区间的中间元素,将目标数据的索引与该右半区间的中间元素进行比较,以此类推,直到查找到目标数据的索引为止。

步骤三、服务器根据该索引在第一数组中所处的位置,查询该第二数组中该位置存储的值,作为该目标数据的值。

例如,如果目标数据的索引在第一数组中位于第i个位置,服务器可以查询第二数组中第i个位置存储的值,作为目标数据的值。

示例性地,如果压缩数据集合存储了100条评论的点赞数量,这100条评论的id分别是(12345600001,12345601001,12345602001...12345699001),其中,id为123456_00_001的评论、id为123456_01_001的评论、id为123456_02_001的评论、id为123456_16_001的评论,id为123456_52_001的评论,id为123456_99_001的评论的点赞数量非空,点赞数量分别是10、20、15、89、198以及2500,则第一数组为[0,1,2,16,52,99],第二数组为[10,20,15,89,198,2500]。如果要查询id为123456_52_001的评论的点赞数量,可以确定该评论的索引为52,将52与第一数组的中间元素16进行比较,52大于16,可知评论的索引落在第一数组的右半区间,而第一数组的右半区间的中间元素为52,则继续将评论的索引52与右半区间的中间元素52进行比较,二者相等,则查询到评论的索引,由于评论的索引位于第一数组的第4个位置(第一数组的起始位置记为第0个位置),则查询第二数组中第4个位置(第二数组的起始位置记为第0个位置),得到198,则确定该评论的点赞数量为198,向终端返回查询结果为198。

通过这个例子可以看出,基于二分查找法,执行两次比较步骤,即可从第一数组查询到数据的索引,因此节省了服务器处理器的计算资源,提高了查询索引的效率。在另一些实施例中,也可以基于顺序查找法,来从第一数组中查询数据的索引,具体地,可以从第一数组的第一个元素开始,将数据的索引与第一数组的每个元素依次进行比较,判断第一数组的当前元素是否是数据的索引,如果第一数组的当前元素是数据的索引,则停止查询,如果第一数组的当前元素不是数据的索引,则继续查询第一数组的下一个元素。

在步骤s38中,如果该第一数组不包括该目标数据的索引,服务器确定该目标数据为空值数据。

例如,如果要查询id为123456_30_001的评论的点赞数量,该评论的索引是id的千位和万位上的取值,即30,如果第一数组为[0,1,2,16,52,99],由于第一数组不包括30,则可以确定这条评论的点赞数量是空值数据,即,这条评论是没有被点赞过的评论,则服务器将0作为这条评论的点赞数量,向终端返回点赞数量为0。

在步骤s39中,如果该第一数组为空,服务器查询该第二数组中该索引对应的位置存储的值,作为该目标数据的值。

示例性地,如果压缩数据集合中存储了100条评论,id分别是(12345600001,12345601001,12345602001...12345699001),其中,id为123456_00_001的评论、id为123456_99_001的评论的点赞数量非空,点赞数量分别是10和20,则第一数组为空,第二数组为[10,0,0,0,…20]。如果要查询id为123456_00_001的评论的点赞数量,可以确定该评论的索引为0,该评论的值存储在第二数组中第0个位置,服务器可以查询第二数组中第0个位置,得到10,则确定id为123456_52_001的评论的点赞数量为10。

在步骤s40中,如果该缓存不包括该压缩数据集合,服务器回源数据库。

上述步骤s36至步骤s39描述了缓存包括压缩数据集合时,从缓存查询数据的流程,而如果压缩数据集合不在缓存中,则可以生成对目标数据的查询请求,向数据库发送查询请求,从而从数据库中读取目标数据。其中,服务器可以确定目标数据所在的压缩数据集合的键,如果从缓存中未查询到该键对应的压缩数据集合,则确定缓存不包括目标数据所在的压缩数据集合。

在一些实施例中,服务器在回源读取目标数据时,可以对目标数据的标识进行归一化,具体参见下述步骤一至步骤二:

步骤一、如果该缓存不包括该压缩数据集合,将该目标数据的标识归一化为该压缩数据集合对应的预设标识。

其中,目标数据所在的压缩数据集合可以是压缩数据集合,也可以是压缩数据集合,本实施例对此不做限定。预设标识可以是压缩数据集合中任一条数据的标识,例如可以是压缩数据集合中第一条数据的标识。例如,如果压缩数据集合中的数据的id分别是(12345600001,12345601001,12345602001...12345699001),则预设标识可以是第一条数据的id,预设标识是12345600001。

通过对目标数据的标识进行归一化,可以达到如下效果:考虑到服务器可以同时接收到对同一个压缩数据集合中多个目标数据的查询请求,如果针对每个目标数据分别回源读取一次,可能会造成重复读取的问题。例如,如果同时接收到对id=12345632001的评论的查询请求以及对id=12345699001的评论的查询请求,这两条评论的点赞数量均位于压缩数据集合123456_001中,如果没有对评论的索引进行归一化,服务器会针对id=12345632001的评论,从数据库回源读取压缩数据集合123456_001,并针对id=12345699001的评论,从数据库回源读取压缩数据集合123456_001,造成从数据库回源读取压缩数据集合123456_001两次,性能开销较大,耗费的处理资源较多。而通过将两条评论的索引均归一化为预设标识12345600001,服务器通过预设标识12345600001,从数据库回源读取压缩数据集合123456_001一次即可,减少了回源数据库的次数,从而节省了回源数据库带来的性能开销。

步骤二、服务器根据该预设标识,从数据库读取该目标数据。

在一些实施例中,步骤二可以包括下述步骤(2.1)至步骤(2.2)。

步骤(2.1)服务器根据该目标数据的标识,确定该数据库中该目标数据所在的目标表。

在一些实施例中,可以将数据的标识的尾号预留出来,通过数据的标识的尾号,来指示数据库中数据所在的表。当查询目标数据时,服务器可以根据目标数据的标识的尾号,来找到目标数据存储在数据库中的哪个表中。具体地,服务器可以对该目标数据的标识的尾号取模,得到模值;服务器可以确定该数据库中标识为该模值的表,作为该目标表。其中,标识的尾号可以是标识的第一数位之后的每个位上的取值。例如,如果第一数位是千位和万位,则标识的尾号可以是个位、十位以及百位。在取模时,可以确定数据库中表的数量,如果数据库包括p个表,可以将尾号与p进行取模,得到模值。其中,p为正整数。

示例性地,以目标数据的id是12345600001,尾号是个位、百位以及千位为例,该目标数据的id的尾号是001。如果将数据库划分为1000张表,可以对001与1000取模,得到模值为1,则可以确定目标数据所在的目标表是表1。

步骤(2.2)服务器从该目标表中,读取该目标数据以及该压缩数据集合中该目标数据之外的其他数据。

在一些实施例中,服务器可以将同一压缩数据集合中的每个数据存储在数据库中的同一表中。具体地,在向数据库存储任一数据的过程中,服务器可以读取该数据的标识,对该数据的标识的尾号取模,得到模值,将该数据存储至数据库中该模值对应的表中。其中,同一个压缩数据集合中存储的每个数据的标识的尾号可以均相同,那么同一压缩数据集合的每个数据的标识的尾号的模值会均相同,而由于模值决定了数据所在的表,因此在存储数据时,可以保证将同一压缩数据集合中的每个数据存储在同一个表中。

通过将压缩数据集合中的每个数据存储在同一表中,目标表中会不仅包括目标数据,还包括压缩数据集合中该目标数据之外的其他数据,因此,服务器可以从目标表中读取压缩数据集合中的每个数据。其中,服务器可以生成查询请求,该查询请求用于查询压缩数据集合中每个数据的值,服务器可以将该查询请求发送给数据库,数据库会响应查询请求,将压缩数据集合中每个数据的值返回给服务器,服务器可以接收数据库返回的压缩数据集合中每个数据的值,从而读取到目标数据以及目标数据之外的其他数据。

其中,查询请求可以包括压缩数据集合中每个数据的标识,查询请求可以是in语法的结构化查询语言(英文:structuredquerylanguage,简称:sql)请求。通过这种查询请求,能够通过一个查询请求,批量化地从数据库读取压缩数据集合中的所有数据,而这从数据库读取一条数据的性能开销相近,因此节省了回源数据库的开销。例如,如果压缩数据集合中100个数据的标识分别是(12345600001,12345601001,12345602001...12345699001),则查询请求可以是sql请求,程序代码为:select*fromxxx_1whereidin(12345600001,12345601001,12345602001...12345699001),通过这一个查询请求,能够批量化地从数据库读取到100条数据。

如果压缩数据集合中的不同数据打散存储在数据库中的不同表中,在回源数据库时,就要分别从数据库的不同表中进行读取。例如,如果每个压缩数据集合存储100条数据,如果100条数据分别打散存储在数据库中的100个表中,在回源数据库读取压缩数据集合的数据时,要分别从100个表中读取数据,也就要分别向数据库发送100次sql请求,才能拿到压缩数据集合中的100条数据。而通过将压缩数据集合的100条数据均存储至数据库中的同一个表中,从1个表中即可读取到压缩数据集合中的每个数据,因此节省了访问数据库的开销。

而通过将压缩数据集合中的每个数据存储在同一表中,可以通过一个查询请求,批量化地从数据库读取压缩数据集合中的所有数据,而这从数据库读取一条数据的性能开销相近,因此节省了回源数据库的开销。通过这种方式,当查询压缩数据集合中1条数据未命中缓存时,能够通过回源一次数据库,将压缩数据集合中其余的99条数据的值一起存储至缓存中,那么后续再次接收到对压缩数据集合中任一条数据的查询请求时,这100条数据的值均可以从缓存中查询到,因此增加了缓存命中率,减少了回源数据库的次数。

在一些实施例中,服务器从目标表中读取压缩数据集合中的每个数据之后,可以根据该每个数据生成压缩数据集合,将该压缩数据集合存储至缓存中。那么,如果后续接收到对压缩数据集合中任一数据的查询请求,均可以从缓存中查询到该数据,而不必回源数据库,从而在一次回源数据库的过程中,将压缩数据集合中的每个数据均重新存储至缓存中,能够减少回源读取的次数,提高回源数据库的效率。例如,如果一个压缩数据集合缓存100条数据,当终端请求查询这100条数据中的任一条目标数据时,如果发现压缩数据集合不在缓存,则表明这100条数据都不在缓存,如果回源数据库时仅读取这一条目标数据,会造成要等到分别接收到100条数据的查询请求,分别回源100次数据库,才能将100条数据重新读回缓存,这会造成服务器的性能开销较大。而通过在回源数据库时,从数据库读取压缩数据集合中的每条数据,可以通过一次查询来从数据库得到压缩数据集合中的100条数据,进而将压缩数据集合中的100条数据均存储至缓存中。例如,如果100条数据的id分别是(12345600001,12345601001,12345602001...12345699001),当查询这100条数据中任一条数据时,可以将该数据的标识归一化为第1条数据的id12345600001,第1条数据的标识的尾号是001,对001与1000取模,得到模值为1,则从表1中读取这100条数据。

本实施例提供的方法,提供了一种新的数据结构,通过以压缩数据集合的形式来存储和查询数据,该压缩数据集合使用两个数组,来分别存储非空值数据的索引以及非空值数据的值,当要查询目标数据的值时,如果从第一数组中找到该目标数据的索引,能够确定目标数据是非空值数据,进而从该第二数组找到该目标数据的值,如果发现第一数组不包括该目标数据的索引,能够确定目标数据是空值数据。一方面,能够保证在查询缓存后,确定待查询的目标数据是否是空值数据,并找到非空值数据的值,从而免去回源数据库的流程,解决了缓存穿透的问题,另一方面,压缩数据集合通过免去了空值数据的键以及空值数据的值占用的存储空间,从而实现了压缩存储数据的功能,通过节省了空值数据在缓存中占用的空间,节省了缓存资源。

图4是根据一示例性实施例示出的一种数据查询装置的框图。参照图4,该装置包括接收单元401,查询单元402和确定单元403。

接收单元401,被配置为执行接收查询请求,该查询请求用于查询目标数据的值;

查询单元402,被配置为执行查询缓存中该目标数据对应的压缩数据集合,该压缩数据集合包括第一数组以及第二数组,该第一数组用于存储非空值数据的索引,该第二数组用于存储该非空值数据的值;

该查询单元402,还被配置为执行如果该第一数组包括该目标数据的索引,从该第二数组查询该目标数据的值;

确定单元403,被配置为执行如果该第一数组不包括该目标数据的索引,确定该目标数据为空值数据。

可选地,该查询单元402,被配置为执行:确定该目标数据的索引在第一数组中所处的位置;根据该索引在该第一数组中所处的位置,查询该第二数组中该位置存储的值,作为该目标数据的值。

可选地,该第一数组中的该非空值数据的索引按照从小到大的顺序依次排列;或者,该第一数组中的该非空值数据的索引按照从大到小的顺序依次排列;

该确定单元403,被配置为执行:基于二分查找法,从该第一数组查询该目标数据的索引,得到该索引在该第一数组中所处的位置。

可选地,该装置还包括:

读取单元,被配置为执行读取该目标数据的标识中第一数位上的取值,作为该目标数据的索引。

可选地,该查询单元402,包括:

读取子单元,被配置为执行读取该目标数据的标识中第二数位上的取值;

查询子单元,被配置为执行根据该第二数位上的取值,从该缓存中查询该压缩数据集合。

可选地,该装置还包括:

归一化单元,被配置为执行如果该缓存不包括该压缩数据集合,将该目标数据的标识归一化为该压缩数据集合对应的预设标识;

读取单元,被配置为执行根据该预设标识,从数据库读取该目标数据。

可选地,该读取单元,包括:

确定子单元,被配置为执行根据该目标数据的标识,确定该数据库中该目标数据所在的目标表;

读取子单元,被配置为执行从该目标表中,读取该目标数据以及该压缩数据集合中该目标数据之外的其他数据。

可选地,该压缩数据集合存储的每个数据的标识的尾号均相同,该确定子单元,被配置为执行:对该目标数据的标识的尾号取模,得到模值;确定该数据库中标识为该模值的表,作为该目标表。

可选地,该查询单元402,还被配置为执行:如果该第一数组为空,查询该第二数组中该索引对应的位置存储的值,作为该目标数据的值。

可选地,该装置还包括:

获取单元,被配置为执行获取待缓存的至少一个数据;

生成单元,被配置为执行根据该至少一个数据中的非空值数据,生成该压缩数据集合;

存储单元,被配置为执行将该压缩数据集合存储至缓存中。

可选地,该生成单元,被配置为执行:如果该非空值数据的数量小于或等于数量阈值,将该非空值数据的索引存储至该第一数组,将该非空值数据的值存储至该第二数组;如果该非空值数据的数量大于该数量阈值,将该第一数组配置为空,将该至少一个数据中每个数据的值存储至该第二数组。

关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

图5是根据一示例性实施例示出的一种服务器的框图,该服务器500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)501和一个或一个以上的存储器502,其中,该存储器502中存储有至少一条指令,该至少一条指令由该处理器501加载并执行以实现上述各个方法实施例提供的数据查询方法。当然,该服务器还可以具有有线或无线网络接口以及输入输出接口等部件,以便进行输入输出,该服务器还可以包括其他用于实现设备功能的部件,在此不做赘述。

在示例性实施例中,还提供了一种包括指令的存储介质,例如包括指令的存储器,上述指令可由服务器的处理器执行以完成上述数据查询方法。可选地,存储介质可以是非临时性计算机可读存储介质,例如,该非临时性计算机可读存储介质可以是只读存储器(read-onlymemory,简称:rom)、随机存取存储器(randomaccessmemory,简称:ram)、只读光盘(compactdiscread-onlymemory,简称:cd-rom)、磁带、软盘和光数据存储设备等。

在示例性实施例中,还提供了一种计算机程序产品,包括一条或多条指令,该一条或多条指令由服务器的处理器执行时,使得所述服务器能够执行上述数据查询方法。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。

应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1