太阳城集团

  • / 11
  • 下载费用:30 金币  

海量数据实时排序查询方法及系统.pdf

摘要
申请专利号:

太阳城集团CN201510500565.0

申请日:

2015.08.14

公开号:

CN105159950A

公开日:

2015.12.16

当前法律状态:

授权

有效性:

有权

法律详情: 授权|||实质审查的生效IPC(主分类):G06F 17/30申请日:20150814|||公开
IPC分类号: G06F17/30 主分类号: G06F17/30
申请人: 深圳市光息谷科技发展有限公司
发明人: 国睿
地址: 518000广东省深圳市南山区招商街道南海大道1029号万融大厦B座G层01-02,06-12号房
优先权: 2014108375091 2014.12.30 CN
专利代理机构: 深圳市中联专利代理有限公司44274 代理人: 李俊
PDF完整版下载: PDF下载
法律状态
申请(专利)号:

CN201510500565.0

授权太阳城集团号:

||||||

法律状态太阳城集团日:

2019.03.26|||2016.11.02|||2015.12.16

法律状态类型:

授权|||实质审查的生效|||公开

摘要

本发明公开了一种海量数据实时排序查询方法及系统,方法包括:排序步骤,根据经验值,将用户从0-n分为n+1个级别,每个级别的所有id号使用链表保存,将用户数据分别保存在链表各个节点内,并建立经验值链表,经验值链表还保存用户在当前经验值级别中的插入顺序,每个经验值链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点;查询步骤,首先从最大经验值即级别为n+1开始,累加每个经验值级别的总人数,再在用户所属的经验值链表中,遍历查询找到该用户在同经验值用户中的排名,累加得到系统中的总排名。本发明能够为上亿用户量级别的海量数据,提供微秒级的查询、增加、删除、实时排序等功能。

权利要求书

权利要求书
1.  一种海量数据实时排序查询方法,其特征在于,包括:
排序步骤,根据经验值,将用户从0-n分为n+1个级别,每个级别的所有id号使用链表保存,且将用户数据分别保存在链表各个节点内,并建立经验值链表,经验值链表还保存用户在当前经验值级别中的插入顺序,每个经验值链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点;
查询步骤,首先从最大经验值即级别为n+1开始,累加每个经验值级别的总人数,再在用户所属的经验值链表中,遍历查询找到该用户在同经验值用户中的排名,累加得到系统中的总排名。

2.  如权利要求1所述的海量数据实时排序查询方法,其特征在于,还包括插入步骤,将用户数据插入到对应级别的经验值链表最尾端。

3.  如权利要求2所述的海量数据实时排序查询方法,其特征在于,针对每个经验值链表数据,增加一个Map映射,Map保存该链表中每个id数据的存储地址,当需要在链表中查找某个用户的排名时,直接通过Map定位到具体地址,提取顺序值即可得到用户在同经验值的用户群中具体排名。

4.  如权利要求3所述的海量数据实时排序查询方法,其特征在于,Map映射实现可采用树结构或者hash表方式实现。

5.  如权利要求1-4任一项所述的海量数据实时排序查询方法,其特征在于,根据应用环境情况取n的值为一固定值。

6.  如权利要求5所述的海量数据实时排序查询方法,其特征在于,取n的值为一固定值,引入额外的数组,数组总共x个元素,每个数组保存n/x个经验值区间的总人数,在插入用户数据或者删除用户数据操作时,需要组的元素进行+1或者-1操作。

7.  一种海量数据实时排序查询系统,其特征在于,包括:
排序模块,根据经验值,将用户从0-n分为n+1个级别,每个级别的所有id号使用链表保存,且将用户数据分别保存在链表各个节点内,并建立经验值 链表,经验值链表还保存用户在当前经验值级别中的插入顺序,每个经验值链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点;
查询模块,首先从最大经验值即级别为n+1开始,累加每个经验值级别的总人数,再在用户所属的经验值链表中,遍历查询找到该用户在同经验值用户中的排名,累加得到系统中的总排名。

8.  如权利要求7所述的海量数据实时排序查询系统,其特征在于,还包括插入模块,将用户数据插入到对应级别的经验值链表最尾端。

9.  如权利要求8所述的海量数据实时排序查询系统,其特征在于,针对每个经验值链表数据,增加一个Map映射,Map保存该链表中每个id数据的存储地址,当需要在链表中查找某个用户的排名时,直接通过Map定位到具体地址,提取顺序值即可得到用户在同经验值的用户群中具体排名。

10.  如权利要求9所述的海量数据实时排序查询系统,其特征在于,Map映射实现可采用树结构或者hash表方式实现。

11.  如权利要求7-10任一项所述的海量数据实时排序查询系统,其特征在于,根据应用环境取n的值为一固定值。

12.  如权利要求11所述的海量数据实时排序查询系统,其特征在于,取n的值为固定值,引入额外的数组,数组总共x个元素,每个数组保存n/x个经验值区间的总人数,在插入用户数据或者删除用户数据操作时,需要组的元素进行+1或者-1操作。

说明书

说明书海量数据实时排序查询方法及系统
技术领域
本发明涉及计算机数据处理技术领域,尤其涉及一种能够为上亿用户量级别的海量数据,提供微秒级的查询、增加、删除、实时排序等功能,且每秒可提供数十万至数百万次访问请求的海量数据实时排序查询方法及系统。
背景技术
在很多软件系统中,都存在类似这样的应用场景:对据有同样属性值的一组数据进行排序,显示排名最靠前的N位数据,显示当前数据排名等。例如BBS论坛,每个论坛注册用户会有一个经验值属性,用户可以看到在所有用户中的排名,以及当前论坛中经验值最高的前几名用户。又如网站中发布文章的点击阅读次数,可看到点击率最高的文章,以及任意一篇文章的点击排名。
传统软件系统中,一般使用关系型数据库系统来存储各种用户资料。例如常见的ERP、CRM系统等,使用Oracle、SQLServer等数据库存储太阳城集团。企业级应用一般数据规模最大在几十万以内,关系型数据库可以很好的解决各种数据存储、排序、提取问题。
用户量突破一定数量级,比如达到数百万、数千万甚至数亿用户后,传统的解决方案无法正常运行。主要表现在当数据库单表数据量超过百万数量级后,即使采用各种优化措施,性能也很难满足系统要求。在几千万数据量的前提下,数据库进行增删改查性能比较低,且单数据库一般只能提供每秒几千次的访问量,无法满足海量并发请求。
发明内容
本发明的目的之一是提供一种能够为上亿用户量级别的海量数据,提供微 秒级的查询、增加、删除、实时排序等功能,且每秒可提供数十万至数百万次访问请求的海量数据实时排序查询方法。
本发明的目的之二是提供一种能够为上亿用户量级别的海量数据,提供微秒级的查询、增加、删除、实时排序等功能,且每秒可提供数十万至数百万次访问请求的海量数据实时排序查询系统。
为了实现上述目的之一,本发明提供的技术方案为:提供一种海量数据实时排序查询方法,包括:
排序步骤,根据经验值,将用户从0-n分为n+1个级别,每个级别的所有id号使用链表保存,且将用户数据分别保存在链表各个节点内,并建立经验值链表,经验值链表还保存用户在当前经验值级别中的插入顺序,每个经验值链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点;
查询步骤,查询某个用户在系统中的总排名时,首先从最大经验值即级别为n+1开始,累加每个经验值级别的总人数,再在用户所属的经验值链表中,遍历查询找到该用户在同经验值用户中的排名,累加得到系统中的总排名。
还包括插入步骤,将用户数据插入到对应级别的经验值链表最尾端。
针对每个经验值链表数据,增加一个Map映射,Map保存该链表中每个id数据的存储地址,当需要在链表中查找某个用户的排名时,直接通过Map定位到具体地址,提取顺序值即可得到用户在同经验值的用户群中具体排名。太阳城集团效率从顺序查找的O(N)提高到O(LogN)或者O(C),根据Map实现方式不同,太阳城集团效率不同。
Map映射实现可采用树结构或者hash表方式实现。
取n的值为100000。
取n的值为100000,引入额外的数组,数组总共101个元素,每个数组保存1000个经验值区间的总人数,在插入用户数据或者删除用户数据操作时,需要组的元素进行+1或者-1操作。稍微降低写入操作性能。但在查询用户排名对对应数的时候,只需先统计分段累积总和,再累加exp,最后增加同经验值人群中排名。
为了实现上述目的之二,本发明提供的技术方案为:提供一种海量数据实 时排序查询系统,包括:
排序模块,根据经验值,将用户从0-n分为n+1个级别,每个级别的所有id号使用链表保存,且将用户数据分别保存在链表各个节点内,并建立经验值链表,经验值链表还保存用户在当前经验值级别中的插入顺序,每个经验值链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点;
查询模块,查询某个用户在系统中的总排名时,首先从最大经验值即级别为n+1开始,累加每个经验值级别的总人数,再在用户所属的经验值链表中,遍历查询找到该用户在同经验值用户中的排名,累加得到系统中的总排名。
还包括插入模块,将用户数据插入到对应级别的经验值链表最尾端。
针对每个经验值链表数据,增加一个Map映射,Map保存该链表中每个id数据的存储地址,当需要在链表中查找某个用户的排名时,直接通过Map定位到具体地址,提取顺序值即可得到用户在同经验值的用户群中具体排名。太阳城集团效率从顺序查找的O(N)提高到O(LogN)或者O(C),根据Map实现方式不同,太阳城集团效率不同。
Map映射实现可采用树结构或者hash表方式实现。
取n的值为100000。
取n的值为100000,引入额外的数组,数组总共101个元素,每个数组保存1000个经验值区间的总人数,在插入用户数据或者删除用户数据操作时,需要组的元素进行+1或者-1操作。稍微降低写入操作性能。但在查询用户排名对对应数的时候,只需先统计分段累积总和,再累加exp,最后增加同经验值人群中排名。
与现有技术相比,本发明是一种能够为上亿用户量级别的海量数据,提供微秒级的查询、增加、删除、实时排序等功能,且每秒可提供数十万至数百万次访问请求的海量数据实时排序查询方法及系统。
通过以下的描述并结合附图,本发明将变得更加清晰,这些附图用于解释本发明的实施例。
附图说明
图1所示为本发明插入用户数据的流程框图。
图2所示为本发明删除用户数据的流程框图。
图3所示为本发明获取某个用户在系统总排名的流程框图。
图4所示为本发明获取系统中实际的最大经验值的流程框图。
图5为基础数据的数据结构示例图。
图6为优化后的每个经验值存储结构示例图。
图7为使用数组保存分段累加方法之后,数据结构示例图。
具体实施方式
现在参考附图描述本发明的实施例,附图中类似的元件标号代表类似的元件。
本发明适用的场景进行限定:
本发明适用于对一组key-value数值进行实时排序的场合,其中value为排序关键字,且value必须满足值为一定范围内的整数,不支持浮点数范围。
第一个实施例:
对基础数据进行的存储方法:首先根据经验值exp,将用户分为从0-100000总共1000001个级别,每个级别的id号使用链表保存。每次插入用户数据(insert操作),将用户数据插入到对应级别链表最尾端。链表中每个节点,除了保存用户id号以外,还保存用户在当前经验值级别中的插入顺序,即如果用户经验值相同,则排名以到达本经验值的先后顺序为准,数据结构示例图如图5所示。
此外,在本实施例中,每个链表使用一个头指针和尾指针,分别指向第一个节点和最后一个节点,通过设置头指针和尾指针方便访问本链表中的第一个节点和最后一个节点的顺序值。
第二个实施例:
使用Map提升单链表查询效率。例如想查询ID号=12345,经验值=1001的某个用户在系统中总的排名,需要首先累加经验值=1002,1003...100000的总人数;再加上该用户在经验值=1001的人群中的排名,即为总排名。
本实施例中,应考虑如何获取某个用户,在同经验值的用户群中的排名。
实际系统应用中,一般经验值或者积分的排名,会呈现很明显的金字塔结构,即高积分的用户数量比较少,处于金字塔的顶端,而最底层20%的积分段,会集中80%左右的用户,以xx会员为例,最大exp约为6万多,但在0-30000分集中了95%以上用户。这种实际的分布,使得上一节中的数据结构查询效率很低。例如总共有5000万用户,可能积分=1001的用户就有几万人。查询某个经验值=1000的用户排名,需要遍历整个链表,需要查询上万次。
为解决这个问题,针对每个经验值链表数据,增加一个Map映射,Map保存该链表中每个id数据的存储地址,优化后的每个经验值存储结构为如图6所示。
Map实现可采用树(本示例图中为树结构),或者hash表等方式实现。
当需要在链表中查找某个用户的排名时,直接通过Map定位到具体地址,提取用户数据的插入顺序值即可得到用户在同经验值的用户群中具体排名。太阳城集团效率从顺序查找的O(N)提高到O(LogN)或者O(C),根据Map实现方式不同,太阳城集团效率不同。
第三个实施例:
使用数组保存分段累加,提升高经验值人数累加统计速度。
统计经验值为1000的某个用户在系统中总排名,需要累加经验值为1001,1002,...100000的所有用户总和。为快速得到某个经验值链表的总人数,只需增加一个尾节点指针,指向链表最后一个节点,直接访问该节点的数序值,即可得到该经验值的人数统计,无需遍历链表累加。但即使如此,累加1001到100000这些经验值的用户总和,也需要进行近10W次累加运算,使得系统每秒只能对外提供不到10000次的查询排名能力。
为解决累加高经验值的统计问题,引入额外的数组。数组总共101个元素,每个数组保存1000个经验值区间的总人数。在插入用户数据或者删除用户数据操作时,需要对对应数组的元素进行+1或者-1操作,因此,引入额外的数据会稍微降低写入操作性能。但在查询用户排名的时候,只需先统计分段累积总和,再累加exp,最后增加同经验值人群中排名。
因此,使用数组保存分段累加方法之后,数据结构如图7所示。
优化后,查询经验值为1001的某用户系统总排名,步骤为:
系统总排名=累加分段统计和+本分段内高经验值的统计+同经验值人群排名;
其中,累加分段统计和,等于99000-99999的分段和,加上98000-98999的分段和,加上...,加上2000-2999的分段和;
本分段内高经验值的统计,等于经验值=1999的人数总和,加上exp=1998的人数总和,加上...加上exp=1002的人数总和;
最后再通过Map定位得到exp=1001的order位置,累加后得到系统总排名。
优化后的累加次数,从此前的10W次数量级,减少到200次,性能提高3个数量级。
由本实施例引申出的,除此以外,引入一个变量,记录当前系统中实际的最大经验值Max_exp,使得无需每次从100000最大值开始累加,而是从实际最大值,例如本例中xx会员最大经验值为65000多开始累加,减少从100000到65000这一段的0累加运算开销。
第四个实施例:
如图1所示,本实施例是插入用户数据的操作,在链表中插入某用户数据时,首先对被插入的用户数据是否合法进行判断,若为非法数据,则直接结束本次插入用户数据操作;若经过判断,本次需要插入的用户数据为合法数据,则继续判断该用户数据是否已经存在,若是,则结束本次插入用户数据操作,若否,则在链表中新增节点并用于保存该用户数据,更新Map新增地址,将分段统计对应数组的元素进行+1操作,结束。
第五个实施例:
如图2所示,本实施例是删除用户数据的操作,在链表中删除某用户数据时,首先对被删除的用户数据是否合法进行判断,若为非法数据,则直接结束本次删除用户数据操作;若经过判断,本次需要删除的用户数据为合法数据,则继续判断该用户数据是否本身不存在,若是,则结束本次删除用户数据操作,若否,则将链表中对应的节点删除,更新Map并删除对应节点地址,将分段统 计对应数组的元素进行-1操作,结束。
第六个实施例:
如图3所示,获取某个用户数据在系统中的总排名:首先是判断需要获取的数据是否合法进行判断,若为非法数据,则直接结束本次操作;若经过判断,本次需要获取的用户数据为合法数据,则继续判断该用户数据是否不存在,若不存在,则结束本次获取用户数据在系统中总排名的操作,若否,进行累加高分段统计,累加本分段内高经验值统计,加上同经验值人群内排名,结束。需要说明的是,本实施例中,如何累加高分段统计,如何累加本分段内高经验值统计等操作,可以参照本发明第三个实施例,再次不再赘述。
第七个实施例:
如图4所示,从当前系统中最大经验值链表开始提取数据,直到提取的数据条数达到指定值,或已经没有数据为止,在本实施例中,需要通过Map进行定位最大经验值链表。
第八个实施例:
在本实施例中,对本发明的测试环境和实际测试结果进行阐述:
本发明针对海量用户数据排序查找使用场景,提供了一种经济高效的解决方案。提高系统响应速度,节省类似场景的开发成本和运行维护成本。
测试环境:
CPU:Inteli73.4G4核
内存:8G
操作系统:Redhat企业版Linux,64位(虚拟机)
数据库:MySQL5.0
测试步骤如下,先构造5000万条数据,插入到数据库,并使用脚本随机获取某个用户的排名;已经查询当前系统中排名最高的前10名用户。
测试结果如下:


注:本测试是在单机运行,不涉及网络命令收发的太阳城集团。5000W条数据占用约4.5G内存。
从测试结果可以看出,在超过千万级数据量的情况下,数据库写入和查询性能大幅下降,且本应用中因为无法直接创建索引数据,查询性能更是无法忍受。而本发明将效率提升数千倍到上万倍,极大提高系统响应太阳城集团。
太阳城集团以上所揭露的仅为本发明的优选实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明申请专利范围所作的等同变化,仍属本发明所涵盖的范围。

关 键 词:
海量 数据 实时 排序 查询 方法 系统
  专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
太阳城集团本文
本文标题:海量数据实时排序查询方法及系统.pdf
链接地址:http://zh228.com/p-6401633.html
太阳城集团我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服客服 - 联系我们

copyright@ 2017-2018 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备17046363号-1 
 


收起
展开
葡京赌场|welcome document.write ('');