一种数据查询方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种在高并发场景下的数据查询方法及装置。
背景技术
当今计算机技术、互联网技术的快速发展,人们的日常生活已经无法离开互联网,越来越多的互联网产品为大家所熟知,并给人们的工作、生活、学习带来极大的便利。
目前,各种信息平台都需要建立在相应的数据库之上,对于一些热门网站,其后台服务器的访问量是十分惊人的,此时面对用户的大量查询请求,服务器反馈查询结果的响应通常会产生延迟。
而随着大数据时代的到来,高并发查询情况会越来越多,当大量的客户端在同一时段内向服务器端发起查询请求时,服务器会根据查询请求中携带主键,先查询自身缓存中是否存在该主键对应的数据(该主键对应的数据即为:所要查询的数据),如果缓存中存在,则直接返回缓存中的数据,如果不存在,则在数据库中查询,并将查到的数据返回给客户端,同时将该数据回写入缓存中,以便下次查询该数据时可直接从缓存中查找。
这种方式下,由于分布式缓存中保存了部分查询请求对应的数据,因此可在一定程度上缓解数据库的查询压力。但是,在出现很多空查(即数据库中不存在所要查询的数据)时,服务器仍然需要查询缓存和数据库,而由于数据库中保存着海量的数据,查询过程必然会使数据库增加很多不必要的查询,从而占用更多的***资源,降低***性能。
发明内容
本申请实施例提供一种数据查询方法及装置,用以解决现有技术中数据库因大量空查而影响***性能的问题。
本申请实施例提供的一种数据查询方法,包括:
接收查询请求;
根据所述查询请求中携带的数据标识,以及预先保存的第一布隆过滤器,判断所述数据标识对应的数据是否存在;
若存在,则获取并返回所述数据;
若不存在,则确定查询失败。
本申请实施例提供的一种数据查询装置,包括:
接收模块,用于接收查询请求;
存储模块,用于存储第一布隆过滤器;
判断模块,用于根据所述查询请求中携带的数据标识,以及预先保存的第一布隆过滤器,判断所述数据标识对应的数据是否存在;
查询模块,用于在所述判断模块的判断结果为是时,获取并返回所述数据,在所述判断模块的判断结果为否时,确定查询失败。
本申请实施例提供的一种数据查询方法和装置,该方法服务器接收到查询请求时,只需根据预存的布隆过滤器,判断该查询请求中携带的数据标识对应的数据是否存在,并仅在其存在时查找并返回该数据,而无需对每个查询请求中携带的数据标识都进行查询,从而可有效过滤空查,避免空查对数据库造成不必要的压力,从而达到降低数据库开销、提升查询效率的目的。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的数据查询过程;
图2为本申请实施例提供的数据查询的详细过程;
图3为本申请实施例提供的数据查询装置结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请实施例提供的数据查询过程,具体包括:
S101:接收查询请求。
在本申请实施例中,用户要查询某个数据时,可先通过客户端向服务器发送查询请求,其中,该查询请求中携带要查询的数据的数据标识,使服务器通过该数据标识,获知要查询的数据是哪个数据。该数据标识一般可以是数据的主键。所述的服务器可以是单一的服务器,也可以一个服务器集群或分布式服务器。
S102:根据该查询请求中携带的数据标识,以及预先保存的第一布隆过滤器,判断该数据标识对应的数据是否存在,若是,则执行步骤S103,否则,执行步骤S104。
在本申请实施例中,服务器预先保存有第一布隆过滤器,该第一布隆过滤器是预先根据数据库中存储的所有数据而生成的。通过查询请求中携带的数据标识以及该第一布隆过滤器,服务器即可判断出该数据标识对应的数据是否存在于数据库中。
具体的,生成布隆过滤器的具体方法是:预设n位的数字序列,每一位均为0,预设k个散列函数,每个散列函数的值域均为0~n,n和k均为自然数,针对数据库中保存的每个数据的数据标识,将该数据的数据标识分别输入这k个散列函数,得到k个散列值,分别记为H1、H2、H3、……Hk,再将n位数字序列中的第H1位、第H2位、第H3位、……第Hk位数字置为1,这样,就相当于将该数据的数据标识“输入”了布隆过滤器,依此方法将数据库中所有数据的数据标识都输入布隆过滤器后,就得到了本申请实施例中所述的第一布隆过滤器。也即,本申请实施例中所述的布隆过滤器具体包括:n位数字序列(由0或1构成)以及k个散列函数。
服务器通过步骤S101接收到查询请求后,根据该查询请求中携带的数据标识以及该第一布隆过滤器,判断该数据标识对应的数据是否存在于数据库中的方法为:将该查询请求中携带的数据标识分别输入这k个散列函数,得到k个散列值,分别记为L1、L2、L3、……Lk,在n位数字序列中,分别判断第L1位、第L2位、第L3位、……第Lk位的数字是否为1,若均为1,则确定该数据标识对应的数据存在于数据库中,若至少一个不为1,则确定该数据标识对应的数据不存在于数据库中。
S103:获取并返回该数据。
如果服务器确定数据存在,则可从数据库中查询该数据标识对应的数据并返回给客户端。
S104:确定查询失败。
如果服务器确定数据不存在,则可确定本次查询为空查,进而确定本次查询失败,可将查询失败的提示信息返回给客户端。
由上述布隆过滤器的生成方法和基于布隆过滤器判断数据是否存在的方法可见,布隆过滤器并非是真正的把数据都存储起来,而是仅以一个n位的数字序列来记录数据是否存在,因此,服务器针对一个查询请求,只需根据该布隆过滤器,即可判断出其是否为空查,若不是空查,再从数据库中查询数据,否则,可不再从数据库中查询,因此可有效避免空查对数据库造成不必要的压力,降低了数据库开销,提升了查询效率。
当然,由上述布隆过滤器的生成方法也可看出,对于存在于数据库中的数据,通过布隆过滤器必定可以确定出其存在于数据库中,对于不存在于数据库中的数据,由于散列函数本身的特性,通过布隆过滤器也有可能将其误判为存在于数据库中,但是,这个误判率(也称为假通过率)可以通过上述n和k计算出来,也就是说,通过调整n和k的值,可以使误判率降低到可以接受的范围以下,比如使误判率降低到千分之一以下。
另外,对于普通的布隆过滤器来说,向布隆过滤器中输入数据是非常方便的,但是,从布隆过滤器中“删除”数据是较为困难的,例如,假设数据库中删除了某个数据,则相应的,本申请实施例中的第一布隆过滤器中也应“删除”该数据的数据标识,但如果简单的将该数据标识在n位数字序列中对应的第H1位、第H2位、第H3位、……第Hk位的数字置为0显然是不妥的,这是因为其他数据标识输入k个散列函数后,可能也会对应第H1位、第H2位、第H3位、……第Hk位中的某一个或者某几个,因此,在本申请实施例中,还可采用改进型的布隆过滤器,改进型的布隆过滤器主要是对n位数字序列中的每一位数字置1的次数进行记录,当“删除”一个数据时,可将该数据在n位数字序列对应的每一位数字置1的次数减1,对于n位数字序列某一位数字来说,如果该位数据被置1的次数为0,则将该位数字变更为0,这样即可方便的从布隆过滤器中删除数据。
在图1所示的步骤S103中,服务器确定查询请求中携带的数据标识对应的数据存在于数据库中后,获取并返回该数据时,可先在自身的缓存中查找该数据,若查找到,则获取并返回该数据,若未查找到,则在数据库中查找该数据,并将查找到的数据返回给客户端。由于服务器从自身缓存中查找数据的速度要远快于从数据库中查找数据的速度,因此,服务器优先从自身的缓存中查找数据,可进一步提高查找数据的效率。
当然,当服务器在自身的缓存中未查找到数据,但在数据库中查找到该数据时,还可将查找到的数据写入到自身的缓存中,以便下次查询该数据时,可从自身的缓存中直接查找到。
进一步的,当服务器优先在自身的缓存中查找数据时,也可根据预先保存第二布隆过滤器进行查找,该第二布隆过滤器是预先根据缓存中存储的所有数据生成的,具体的,服务器可根据查询请求中携带的数据标识,以及预先保存的第二布隆过滤器,判断该数据标识对应的数据是否存在于缓存中,若是,则从缓存中获取该数据并返回给客户端,否则,在数据库中查找该数据,并将查找到的数据返回给客户端。当然,如果根据第二布隆过滤器确定该数据不存在于缓存中,并从数据库中查找到该数据时,为了便于下次查找该数据时可从缓存中直接查找到,服务器还可将查找到的数据写入到自身的缓存中,并根据写入该数据后的缓存中存储的所有数据,更新第二布隆过滤器。
上述第二布隆过滤器的生成方法和使用方法均与第一布隆过滤器是类似的,二者区别仅在于第一布隆过滤器是根据数据库中存储的数据生成的,第二布隆过滤器是根据服务器缓存中存储的数据生成的,这里就不再对第二布隆过滤器的生成和使用方法进行赘述。
需要说明的是,本申请实施例提供的数据查询方法可应用于高并发查询较多的电子商务场景,则本申请实施例所述的查询请求包括但不限于商品信息查询请求、交易记录查询请求等,所述的数据标识包括但不限于商品名称、商品身份识别码(IDentity,ID)等,所述的服务器包括但不限于电商网站服务器、支付服务器等。
图2为本申请实施例提供的数据查询的详细过程,具体包括以下步骤:
S201:服务器接收查询请求。
S202:根据查询请求中携带的数据标识,以及预先保存的第一布隆过滤器,判断该数据标识对应的数据是否存在,若是,执行步骤S203,否则执行步骤S206。
其中,该第一布隆过滤器是根据数据库中存储的所有数据生成的。
S203:根据该数据标识,以及预先保存的第二布隆过滤器,判断该数据标识对应的数据是否存在于缓存中,若是,执行步骤S204,否则执行步骤S205。
S204:从缓存中获取该数据并返回。
其中,该第二布隆过滤器是根据缓存中存储的所有数据生成的。
S205:在数据库中查找该数据并返回,将查找到的数据写入缓存中,并根据写入该数据后的缓存中存储的所有数据,更新第二布隆过滤器。
S206:确定查询失败。
以上为本申请实施例提供的数据查询方法,基于同样的思路,本申请实施例还提供了一种数据查询装置,如图3所示。
图3为本申请实施例提供的数据查询装置结构示意图,具体包括:
接收模块301,用于接收查询请求;
存储模块302,用于存储第一布隆过滤器;
判断模块303,用于根据所述查询请求中携带的数据标识,以及预先保存的第一布隆过滤器,判断所述数据标识对应的数据是否存在;
查询模块304,用于在所述判断模块303的判断结果为是时,获取并返回所述数据,在所述判断模块303的判断结果为否时,确定查询失败。
所述存储模块302具体用于,预先根据数据库中存储的所有数据,生成对应的第一布隆过滤器并保存。
所述查询模块304具体用于,在所述判断模块303的判断结果为是时,在缓存中查找所述数据,若查找到,则获取并返回所述数据,若未查找到,则在数据库中查找所述数据,并将查找到的数据返回。
所述查询模块304还用于,当在所述数据库中查找到所述数据时,将查找到的数据写入所述缓存中。
所述查询模块304具体用于,在所述判断模块303的判断结果为是时,根据所述数据标识,以及预先保存的第二布隆过滤器,判断所述数据标识对应的数据是否存在于缓存中,若是,则从缓存中获取所述数据并返回,否则,在数据库中查找所述数据,并将查找到的数据返回,其中,所述第二布隆过滤器是根据所述缓存中存储的所有数据生成的。
所述查询模块304还用于,当在所述数据库中查找到所述数据时,将查找到的数据写入所述缓存中,根据写入所述数据后的缓存中存储的所有数据,更新第二布隆过滤器。
本申请实施例提供的一种数据查询方法和装置,该方法服务器接收到查询请求时,只需根据预存的布隆过滤器,判断该查询请求中携带的数据标识对应的数据是否存在,并仅在其存在时查找并返回该数据,而无需对每个查询请求中携带的数据标识都进行查询,从而可有效过滤空查,避免空查对数据库造成不必要的压力,从而达到降低数据库开销、提升查询效率的目的。
本领域内的技术人员应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。