数据存储方法、装置及存储介质与流程

文档序号:16068569发布日期:2018-11-24 12:55阅读:169来源:国知局
本发明涉及互联网
技术领域
,特别涉及一种数据存储方法、装置及存储介质。
背景技术
在现代生活中,为使用户了解到最新的资讯,网络平台定时会向终端所在用户推送一些消息。为确保每个终端均能接收到消息,同时避免重复发送的消息对用户过度打扰,在将消息推送给用户之后,常常需要存储消息标识及用户标识。如果将消息标识称为第一数据,将用户标识称为第二数据,现有技术在进行数据存储时,直接将第一数据和第二数据存储到哈希表中。然而,随着互联网上用户数量及消息数量的增多,采用哈希表进行数据存储时,存储的数据将占用系统大量的存储空间,进而降低系统性能。例如,设定用户数量为10亿个,每个用户推送2条消息,哈希表的存储利用率50%(哈希表自身性能决定的,存储数据时利用率不会到达100%),用户标识的字符串平均长度为10个字节,消息标识的字符串长度为8个字节,当采用哈希表进行存储时,所需的存储空间为{[(10亿*18字节*2*2)/1024]/1024}/1024=67.1g。技术实现要素:为了解决现有技术的问题,本发明实施例提供了一种数据存储方法、装置及存储介质。所述技术方案如下:第一方面,提供了一种数据存储方法,所述方法包括:获取待存储数据记录,所述待存储数据记录由用户标识和消息标识组成;采用至少两个目标哈希函数对所述待存储数据记录进行计算,得到至少两个第一哈希值,所述至少两个目标哈希函数相互独立;确定每个第一哈希值在位数组中对应的存储位置,所述位数组中的数据采用二进制形式进行存储,且所述位数组不同的存储位置对应不同的哈希值;当任一第一哈希值对应的存储位置上未存储有二进制数据,在所述存储位置上存储所述第一哈希值对应的二进制数据。第二方面,提供了一种数据存储装置,所述装置包括:第一获取模块,用于获取待存储数据记录,所述待存储数据记录由用户标识和消息标识组成;第一计算模块,用于采用至少两个目标哈希函数对所述待存储数据记录进行计算,得到至少两个第一哈希值,所述至少两个目标哈希函数相互独立;第一确定模块,用于确定每个第一哈希值在位数组中对应的存储位置,所述位数组中的数据采用二进制形式进行存储,且所述位数组不同的存储位置对应不同的哈希值;存储模块,用于当任一第一哈希值对应的存储位置上未存储有二进制数据,在所述存储位置上存储所述第一哈希值对应的二进制数据。第三方面,提供了一种非临时性计算机可读存储介质,所述存储介质中存储有至少一条指令,所述指令由所述处理器加载并执行以实现第一方面所述的数据存储方法。本发明实施例提供的技术方案带来的有益效果是:在获取到待存储数据记录后,采用至少两个目标哈希函数计算待存储数据的哈希值,进而将每个第一哈希值对应的二进制数据存储到对应的存储位置上。由于无需存储数据本身,仅存储哈希值对应的二进制数据,且仅当存储位置上未存储有二进制数据时,才存储该哈希值对应的二进制数据,因而节省了存储空间。附图说明为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1是本发明涉及的一种位数组存储状态的示意图;图2是本发明涉及的另一种位数组存储状态的示意图;图3是本发明另一个实施例提供的blomfilter与redis集成的原理图;图4是本发明一个实施例提供的一种数据存储方法所涉及实施环境的示意图;图5是本发明另一个实施例提供的一种数据存储方法的流程图;图6是本发明另一个实施例提供的一种数据查询过程的示意图;图7是本发明另一个实施例提供的一种数据同步过程的示意图;图8是本发明另一个实施例提供的一种数据存储装置的结构示意图;图9是根据一示例性实施例示出的一种用于数据存储的服务器。具体实施方式为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。在进行详细说明之前,首先对本发明实施例涉及的概念进行如下解释:bloomfliter:是一个很长的二进制向量和一系列随机映射函数,可用于检索一个元素是否在一个集合中。它的优点是空间效率高和查询时间短,缺点是存在误识别率且无法将一个元素彻底删除。redis:是一个使用ansic编写的、开源的、支持网络的、基于内存可选持久性的键值存储数据库。postgresql:是一种开源关系型数据库。位数组:用于存储二进制数据的数组,且数组中不同的存储位置对应不同的哈希值。图1为一种位数组的存储状态的示意图,图1中第一行表示该位数组的存储位置,当存储位置上的标识为1时,表示该存储位置上存储有二进制数据;当存储位置上的标识为0时,表示该存储位置上未存储有二进制数据。图1中第二行表示该位数组每个存储位置对应的哈希值。由图1可知,第一存储位置对应的哈希值为0,第二存储位置对应的哈希值为1,第三存储位置对应的哈希值为2,第四存储位置对应的哈希值为3,第五存储位置对应的哈希值为4,第六存储位置对应的哈希值为5,第七存储位置对应的哈希值为6,第八存储位置对应的哈希值为7,第九存储位置对应的哈希值为8,第十存储位置对应的哈希值为9,第十一存储位置对应的哈希值为10,第十二存储位置对应的哈希值为11。bloomfliter算法原理:设定s为包含n个元素的集合,s={x1,x2,…,xn},采用k个相互独立的哈希函数将集合中的每个元素映射到{1,…,m}的位数组中。例如,设定s中包含两个元素,分别为x1、x2,哈希函数的数量k为3个,分别为h0、h1、h2,采用哈希函数h0、h1、h2计算x1、x2的哈希值,可得到:h0(x1)=1,h1(x1)=4,h2(x1)=8h0(x2)=4,h1(x2)=6,h2(x2)=10。由图1可知,采用哈希函数h0、h1、h2对x1进行计算得到的哈希值可映射到第二存储位置、第五存储位置及第九存储位置;采用哈希函数h0、h1、h2对x2进行计算得到的哈希值可将x2映射到第五存储位置、第七存储位置及第十一存储位置。同理,基于bloomfliter算法,在进行数据查询时,可采用k个相互独立的哈希函数计算待查询数据的哈希值,如果待查询数据的每个哈希值在位数组中均能查找到,则可确定位数组中存储该待查询数据,如果待查询数据的任一哈希值在位数组中无法查找到,则可确定位数组中未存储该待查询数据。参见图2,对于两个待查询数据y1、y2,哈希函数的数量为3个,分别为h0、h1、h2,采用哈希函数h0、h1、h2计算y1、y2的哈希值,可得到:h0(y1)=1,h1(y1)=4,h2(y1)=8h0(y2)=5,h1(y2)=6,h2(y2)=10。由于y1的三个哈希值1、4、8能够映射到图2中,因而可确定位数组中存储有待查询数据y1;由于y2的三个哈希值5、6、10能够映射到图2中,因而可确定位数组中存储有待查询数据y2。由上述内容可知,采用位数组对数据进行存储时,主要是根据存储位置与哈希值之间的映射关系进行存储,当两个数据的哈希值相同时,为了节省存储空间,仅存储一次该相同的哈希值对应的二进制数据,这样就存在一个哈希值对应多个数据的情况。随着存储的数据量增多,这种情况将愈发凸显,从而导致数据在查询时发生误判。以图1为例,采用哈希函数h0、h1、h2对x1进行计算得到的哈希值为1、4、8,对x2进行计算得到的哈希值为4、6、10,如果数据t未存储于位数组中,但采用哈希函数h0、h1、h2对t进行计算得到的哈希值为1、4、10,由于位数组中存储有哈希值1、4、10对应的二进制数据,因而会对数据t进行误判,认为数据t存储于位数组。为了提高查询准确性,发明实施例提提供的方法还将通过预查询生成一个消息误判表,进而根据该消息误判表进行二次查询,从而使得查询准确率能够达到100%。redis为一种开源分布式内存数据库,虽然redis本身不提供bloomfliter的数据结构,但redis提供了setbit(存储)、getbit(获取)、bitcount(统计)、bitop(计算)四个命令,可用于处理二进制位数组,使得bloomfliter算法可以与redis集成起来。其中,setbit命令用于为位数组指定偏移量上的二进制位设置值,位数组的偏移量从0开始计数,而二进制位的值则可以为0或者1。getbit用于获取位数组指定偏移量上的二进制位的值。bitcount用于统计位数组里面值为1的二进制的数量。bitop用于对多个位数组进行按位与(and)、按位或(or)、按位异或(xor)运算,可以对给定的位数组进行取反(not)运算。图3示出了redis与bloomfliter集成的原理图,参见图3,redis使用字符串对象来表示位数组,由于字符串对象使用的sds数据结构是二进制数较为安全,因而可以直接使用sds结构来存储位数组,并使用sds结构的操作函数来处理位数组。图3还示出了采用sds表示的一字节长的位数组。其中,redisobject.type的值为redis_string,表示这是一个字符串对象。sdshdr.len属性的值为3,表示这个sds保存一个三字节长的位数组。buf数组中的每个字节都用一行表示,每行的第一个格子buf[i]表示这个buf数组的哪个字节,而buf[i]之后的八个格子则分别代表这个字节中的八个位。buf数组保存位数组的顺序与书写位数组的顺序完全是相反的,例如,buf[0]字节中各个位的值1、0、1、1、0、0、1、0,这表示buf[0]字节保存的位数组为0100、1101。通过采用逆序来保存位数组可以简化setbit命令的实现。位数组由buf数组中的buf[0]、buf[1]、buf[2]三个字节保存。本发明实施例通过将redis与bloomfliter集成,实现了bloomfliter分布式内存存储。bloomfliter分布式内存存储具有以下优点:第一、多个分布式应用共同读取内存,方便系统解耦,提高系统性能并保证数据的一致性。第二、采用分布式内存存储,便于实时更新和剔除内存中的数据,将结果实时反映给应用层。第三、直接使用java内存面临垃圾回收问题,性能和稳定性无法得到保证,将数据加载到redis内存后比较稳定可靠,redis管理bloomfliter的数据,即能保证数据可靠性又能提升内存效率。图4为本发明提供的数据存储方法所涉及的实施环境,参见图4,该实施环境包括redis集群和postgresql集群。其中,redis集群包括主redis101和从redis102。postgresql集群包括主postgresql103及从postgresql104。其中,主redis101包括位数组(bitarry)和消息误判表,该位数组用于存储数据记录的哈希值对应的二进制数据。在实际应用中,主redis101还将存储的数据同步到从redis102中,从而在主redis101因宕机无法提供服务时,可由从redis102提供服务。为了避免主redis101和从redis102同时宕机而影响服务,主redis101每隔预设时长(如1小时、2小时等等)可将存储的数据同步到主postgresql103中。考虑到postgresql集群的稳定性,主postgresql103还将存储的数据同步到从postgresql104中。通过主redis101、从redis102、主postgresql103及从postgresql104之间的多重同步,保证服务能够持续进行,提高了系统的稳定性。在实际消息推送过程中,常常会遇到如下两种场景:场景一:海量用户消息实时推送。对于该种场景,下面将结合表1和表2进行说明。其中,表1为用户账号一览表,且表1中存储的10亿用户。表2为推送消息一览表,且表2中存储10万类消息。表1用户标识(usercode)用户名(username)创建时间(createtime)aronleo123李四2017-02-1309:18:20adamwangabc王五2017-02-1210:10:10edwardzhang张三2017-02-1106:21:20………gavinliuabc刘一2017-02-1007:18:12表2在海量用户消息实时推送场景下,设定每个用户订阅一个分类的消息,每天向每个用户推送2条消息,则每天推送消息的总数量高达10亿*2=20亿条,这20亿条消息在推送时过程中,就面临着如何避免重复推送的问题。场景二:海量用户系统的批量白名单开放控制场景。为使推送的消息更具针对性,服务器可根据用户的属性信息,选取满足某些条件的用户(这些用户为白名单用户),进而向这些用户推送消息。在该场景下,也涉及了避免重复推送的问题。为了避免在上述两种场景下消息重复推送,本发明实施例提供了一种数据存储方法,该方法采用位数组数据记录对应的二进制数据,不仅节省了存储空间,且查询时无需进行遍历操作,通过计算待查询数据记录的哈希值,即可根据该哈希值判断是否存储有待查询的数据记录,大大缩短的查询时间。本发明实施例提供了一种数据存储方法,该方法应用于服务器中,该服务器具有图4所示的数据存储系统,且数据存储系统中的每个redis均集成有bloomfliter的功能。参见图5,本发明实施例提供的方法流程包括:501、服务器预先确定查询误判率,并生成误判消息表。其中,查询误判率为在历史查询过程中出现错误的比例,该查询误判率可通过计算错误次数与查询次数的比值得到。例如,在历史查询过程中,如果查询次数为10万次,错误次数为10次,则查询误判率为0.0001。其中,误判消息表为由历史查询过程中出现错误的数据记录组成。例如,在历史查询过程中,如果错误次数为10次,则可将10次错误的数据记录组成误判消息表。服务器预先确定查询误判率时,可采用如下方法:第一步,服务器获取目标用户的用户标识和待推送消息的消息标识。其中,目标用户为本次进行消息推送时需要推送的用户。目标用户的数量根据实际应用场景确定,可以为10万、20万、10亿等等,本发明实施例不对目标用户的数量作具体的限定。待推送消息的数量可根据实际应用场景及消息更新速度确定,该待推送消息的数量可以为每天2条、每天3条等等。第二步,服务器根据目标用户的用户标识和待推送消息的消息标识,生成数据记录。对于任一目标用户和任一条待推送消息,服务器可将该目标用户的用户标识的字符串与该待推送消息的消息标识的字符串进行拼接,生成数据记录。具体拼接时,可将待推送消息的消息标识的字符串添加到目标用户的用户标识的字符串后面,也可将目标用户的用户标识的字符串添加到待推送消息的消息标识的字符串后面,当然,还可以其他方式生成数据记录,本发明实施例不再一一说明。第三步,服务器基于bloomfliter算法,对生成的数据进行预查询,从中筛选出误判数据记录。第四步,服务器根据误判数据记录和查询次数,计算查询误判率,并将误判数据记录组成误判消息表。需要说明的是,该步骤501所计算的查询误判率及生成的误判消息表,并不是在实际消息推送过程中得到的,而是为了提高查询准确率,服务器基于bloomfliter算法进行预查询时得到的。501、服务器预先确定至少两个目标哈希函数和位数组。考虑到实际存储需求,本发明实施例中的位数组可由多个子位数组组成,每个子位数组具有确定的存储空间,例如最大存储512m数据。每个子位数组均对应一个位数组标识,该位数组标识用于表示不同子位数组的数据存储顺序,该位数组标识可以为1、2、3等等。在进行数据存储时,当可位数组标识1对应的子位数组达到存储上限时,可将数据记录对应的二进制数据存储到位数组标识2对应的子位数组中。其中,至少目标两个哈希函数相互独立。当采用至少两个目标哈希函数对数据记录进行计算时,得到的至少两个哈希值也彼此独立,从而保证对同一数据记录计算得到的至少两个哈希值在位数组中对应不同的存储位置。服务器确定至少两个目标哈希函数和位数组时,可采用如下步骤5021~5024:5021、服务器根据目标用户数量和待推送消息数量,确定消息的推送总数量。服务器根据实际推送需求,从海量用户中选取目标用户,并确定目标用户数量。如果需要将消息推送给每个用户,则将每个用户作为目标用户;如果需要将消息推送给满足一定条件的用户(例如,年龄小于18岁的用户,或者北京地区的用户,或者男性用户等等),则将满足条件的用户作为目标用户。当获取到目标用户数量后,服务器将目标用户数量与待推送消息数量之积,作为消息的推送总次数。例如,目标用户数量为10亿,待推送消息数量为2条,则消息的推送总次数为10亿*2=20次。5022、服务器根据推送总数量和预先确定的查询误判率,计算位数组的目标存储空间。考虑到bloomfliter算法的不同利用率,本发明实施例提供的方法在根据推送总数量和预先确定的查询误判率,计算位数组的目标存储空间时,可分为如下两种情况:第一种情况、bloomfliter算法的利用率为90%。针对第一种情况,服务器根据推送总数量和预先确定的查询误判率,可应用公式计算位数组的目标存储空间。其中,m为位数组的目标存储空间,n为推送总数量,e为预先确定的查询误判率,可由上述步骤301确定。例如,消息的推送总数量为20亿,预先确定的查询误判率为0.0001,则位数组的目标存储空间现有技术采用哈希表进行存储时,所需的存储空间为67.1g,而采用本发明实施例提供的方法所需的存储空间为1.34g,仅为现有技术的1/50,大大节省了存储空间。第二种情况、bloomfliter算法的利用率为50%。针对第一种情况,服务器根据推送总数量和预先确定的查询误判率,可应用公式计算位数组的目标存储空间。例如,消息的推送总数量为20亿,预先确定的查询误判率为0.0001,则位数组的目标存储空间现有技术采用哈希表进行存储时,所需的存储空间为67.1g,而采用本发明实施例提供的方法所需的存储空间为4.46g,仅为现有技术的1/50,大大节省了存储空间。5023、服务器根据位数组的目标存储空间和推送总数量,计算目标哈希函数的目标数量。服务器根据位数组的目标存储空间和推送总数量,应用公式计算目标哈希函数的目标数量。其中,k为目标哈希函数的目标数量。例如,如果消息的推送总数量为20亿,位数组的存储空间为1.34g,则目标哈希函数的目标数量为如果消息的推送总数量为20亿,位数组的存储空间为4.46g,则目标哈希函数的目标数量为5024、服务器获取目标数量个相互独立的哈希函数,并将目标数量个相互独立的哈希函数作为至少两个目标哈希函数。基于所确定的目标哈希函数的目标数量,服务器随机选取该目标数量个相互独立的哈希函数,并将所选取的哈希函数作为至少两个目标哈希函数。503、服务器获取待存储数据记录。在消息推送场景下,当进行消息推送后,服务器获取所推送的用户标识和消息标识,生成待存储数据记录。关于待存储数据记录的生成方式,可参见步骤301,此处不再赘述。504、服务器采用至少两个目标哈希函数对待存储数据记录进行计算,得到至少两个第一哈希值。基于预先确定的至少两个目标哈希函数,服务器通过采用至少两个目标哈希函数对待存储数据记录进行计算,可得到至少两个第一哈希值。505、服务器确定每个第一哈希值在位数组集合中对应的存储位置。由于位数组中的每个存储位置对应一个哈希值,因此,当计算出至少两个哈希值后,服务器可根据每个存储位置与哈希值之间的对应关系,确定每个第一哈希值在位数组中对应的存储位置。以上述表1为例,设定目标哈希函数的数量为3个,分别为h0、h1、h2,采用目标哈希函数h0、h1、h2计算待存储数据的哈希值,得到第一哈希值分别为2、5、8,则根据表1存储位置与哈希值之间的对应关系,可得到第一哈希值2在位数组中对应的存储位置为第三存储位置,第一哈希值5对应在位数组中对应的存储位置为第六存储位置,第一哈希值8在位数组中对应的存储位置为第九存储位置。506、当任一第一哈希值对应的存储位置上未存储有二进制数据,服务器在存储位置上存储第一哈希值对应的二进制数据。当任一第一哈希值对应的存储位置上未存储有二进制数据,服务器还将在该存储位置上存储该第一哈希值对应的二进制数据。进一步,当任一第一哈希值对应的存储位置上存储有二进制数据,为了节省存储空间,服务器不会再次对该第一哈希值对应的二进制数据进行重复存储。至此,通过该上述步骤501~步骤506实现了数据的存储,在此基础上,还支持对数据进行查询。具体查询过程,可参见下述步骤(a)~(c):(a)、服务器接收数据查询请求。其中,数据查询请求包括待查询数据记录,该待查询数据记录可根据待推送目标用户标识和待推送消息的消息标识生成,具体生成方式可参见上述步骤301,此处不再赘述。(b)、服务器采用至少两个目标哈希函数对数据查询记录进行计算,得到至少两个第二哈希值。(c)、服务器根据位数组集合和至少两个第二哈希值,确定查询结果。服务器根据位数组集合和至少两个第二哈希值,确定查询结果时,包括但不限于如下三种情况:第一种情况、当位数组中存储有每个第二哈希值,服务器判断误判消息表中是否存储待查询数据记录,当误判消息表中存储待查询数据记录,可确定查询结果为位数组中未存储待查询数据记录。第二种情况、当位数组中存储有每个第二哈希值,服务器判断误判消息表中是否存储待查询数据记录,当误判消息表中未存储待查询数据记录,可确定查询结果为位数组中已存储待查询数据记录。第三种情况、当位数组中未存储任一第二哈希值,服务器确定查询结果为位数组中未存储待查询数据记录。本发明实施例提供的方法在进行数据查询时,通过查询误判消息表,克服了采用bloomfliter算法进行数据查询时存在误判率的问题,提高了查询结果的准确性。对于上述数据查询过程,为了便于理解,下面将以图6为例进行说明。参见图6,在进行消息推送时,服务器获取待推送消息的消息标识和目标用户标识,并根据消息标识和目标用户标识,生成待查询数据记录,并采用bloomfliter算法查询位数组中是否存储有该待查询数据记录,当确定位数组中未存储该待查询数据记录,将该待查询数据记录存储到位数组中,并返回查询结果;当确定存储有该待查询数据记录,扫描哈希表(误判消息表),如果哈希表中存储有待查询数据记录,则确定位数组中未存储该待查询数据记录,将该待查询数据记录存储到位数组中,并返回查询结果;如果哈希表中未存储待查询数据记录,则确定位数组中存储有该待查询数据记录,并返回查询结果。为了提升系统性能,避免redis服务全部宕机而无法恢复,本发明实施例提供的方法还将redis中存储的数据同步到postgresql中。图7为示出了具体的同步过程。本发明实施例提供的方法,在获取到待存储数据记录后,采用至少两个目标哈希函数计算待存储数据的哈希值,进而将每个第一哈希值对应的二进制数据存储到对应的存储位置上。由于无需存储数据本身,仅存储哈希值对应的二进制数据,且仅当存储位置上未存储有二进制数据时,才存储该哈希值对应的二进制数据,因而节省了存储空间。参见图8,本发明实施例提供了一种数据存储装置,该装置包括:第一获取模块801,用于获取待存储数据记录,该待存储数据记录由用户标识和消息标识组成;第一计算模块802,用于采用至少两个目标哈希函数对待存储数据记录进行计算,得到至少两个第一哈希值,该至少两个目标哈希函数相互独立;第一确定模块803,用于确定每个第一哈希值在位数组中对应的存储位置,该位数组中的数据采用二进制形式进行存储,且位数组不同的存储位置对应不同的哈希值;存储模块804,用于当任一第一哈希值对应的存储位置上未存储有二进制数据,在存储位置上存储第一哈希值对应的二进制数据。在本发明的另一个实施例中,该装置还包括:第二确定模块,用于根据目标用户数量和待推送消息数量,确定消息的推送总数量;第二计算模块,用于根据推送总数量和预先确定的查询误判率,计算位数组的目标存储空间,该查询误判率为在历史查询过程中出现错误的比例;第三计算模块,用于根据位数组的目标存储空间和推送总数量,计算目标哈希函数的目标数量;第二获取模块,用于获取目标数量个相互独立的哈希函数,并将目标数量个相互独立的哈希函数作为至少两个目标哈希函数。在本发明的另一个实施例中,第二计算模块,用于根据推送总数量和预先确定的查询误判率,应用以下公式,计算位数组的目标存储空间:第三计算模块,用于根据位数组的目标存储空间和推送总数量,应用以下公式,计算目标哈希函数的目标数量:其中,m为位数组的目标存储空间,n为推送总数量,e为预先确定的查询误判率,k为目标哈希函数的目标数量。在本发明的另一个实施例中,第二计算模块,用于根据推送总数量和预先确定的查询误判率,应用以下公式,计算位数组的目标存储空间:第三计算模块,用于根据位数组的目标存储空间和推送总数量,应用以下公式,计算目标哈希函数的目标数量:其中,m为位数组的目标数量,n为推送总数量,e为预先确定的查询误判率,k为目标哈希函数的目标数量。在本发明的另一个实施例中,该装置还包括:接收模块,用于接收数据查询请求,数据查询请求包括待查询数据记录;第四计算模块,用于采用至少两个哈希函数对数据查询记录进行计算,得到至少两个第二哈希值;第三确定模块,用于根据位数组和至少两个第二哈希值,确定查询结果。在本发明的另一个实施例中,第三确定模块,用于当位数组中存储有每个第二哈希值,判断误判消息表中是否存储待查询数据记录,该误判消息表中存储有在历史查询过程中出现错误的数据记录;当误判消息表中存储有待查询数据记录,确定查询结果为位数组中未存储待查询数据记录;当误判消息表中未存储待查询数据记录,确定查询结果为位数表中存储有待查询数据记录。在本发明的另一个实施例中,第三确定模块,用于当位数组中未存储任一第二哈希值,确定查询结果为位数组中未存储待查询数据记录。综上,本发明实施例提供的装置,在获取到待存储数据记录后,采用至少两个目标哈希函数计算待存储数据的哈希值,进而将每个第一哈希值对应的二进制数据存储到对应的存储位置上。由于无需存储数据本身,仅存储哈希值对应的二进制数据,且仅当存储位置上未存储有二进制数据时,才存储该哈希值对应的二进制数据,因而节省了存储空间。图9是根据一示例性实施例示出的一种用于数据存储的服务器。参照图9,服务器900包括处理组件922,其进一步包括一个或多个处理器,以及由存储器932所代表的存储器资源,用于存储可由处理组件922的执行的指令,例如应用程序。存储器932中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件922被配置为执行指令,以执行上述图5中数据存储方法中服务器所执行的功能。服务器900还可以包括一个电源组件926被配置为执行服务器900的电源管理,一个有线或无线网络接口950被配置为将服务器900连接到网络,和一个输入输出(i/o)接口958。服务器900可以操作基于存储在存储器932的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。本发明实施例提供的服务器,在获取到待存储数据记录后,采用至少两个目标哈希函数计算待存储数据的哈希值,进而将每个第一哈希值对应的二进制数据存储到对应的存储位置上。由于无需存储数据本身,仅存储哈希值对应的二进制数据,且仅当存储位置上未存储有二进制数据时,才存储该哈希值对应的二进制数据,因而节省了存储空间。本发明实施例还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器,上述指令可由终端中的处理器执行以完成上述实施例中的数据存储的方法。例如,所述非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。本发明实施例提供的非临时性计算机可读存储介质,在获取到待存储数据记录后,采用至少两个目标哈希函数计算待存储数据的哈希值,进而将每个第一哈希值对应的二进制数据存储到对应的存储位置上。由于无需存储数据本身,仅存储哈希值对应的二进制数据,且仅当存储位置上未存储有二进制数据时,才存储该哈希值对应的二进制数据,因而节省了存储空间。需要说明的是:上述实施例提供的数据存储装置在存储数据时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将数据存储装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据存储装置与数据存储方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1