一种排行榜数据的生成方法及相关装置与流程

文档序号:17641788发布日期:2019-05-11 00:43阅读:256来源:国知局
一种排行榜数据的生成方法及相关装置与流程

本申请涉及排行榜数据生成技术领域,尤其涉及一种排行榜数据生成方法及相关装置。



背景技术:

排行榜是对某一相关同类事物的客观实力的反映,带有相互之间的比较性质。所以为了促进竞争,也为了提高广大群众的关注度和积极性,需要开发并更新各种排行榜。例如,游戏排行榜、关注度排行榜和流行歌曲排行榜。

而决定用户排名先后的元数据一般包括多个维度;例如,在游戏排行榜中,排行榜元数据包括参与次数、付费次数、付费金额、胜率、游戏积分、游戏时间等多个维度的数据,具体地,可以以参与次数和游戏时间组合形成劳模排行榜,具体是先按参与次数进行排序,若参与次数相同,则按游戏时间的多少进行排序,从而生成劳模排行榜。

目前,排行榜生成的方法主要是将元数据存储在数据库中,然后利用数据库的结构化查询语言中的orderby指令并按照一个或多个维度对元数据进行排序,最终生成用户排行榜。

然而,orderby指令有以下缺陷:当数据量大时,该指令性能较差,影响数据库的正常服务;当数据库分库分表后,该指令无法使用,所以当需要增加元数据类别时,需要修改表存储结构,对线上数据影响大。



技术实现要素:

本申请实施例提供了本申请实施例公开了一种排行榜数据的生成方法及相关装置,利用缓存的自动排序功能,辅助生成排行榜数据,不存在指令性能较差的技术问题,且适用于数据库分库分表。

有鉴于此,本申请第一方面提供了一种排行榜数据的生成方法,包括:

从数据库中获取所有用户的行为数据及排行榜配置,所述行为数据包括多个维度的元数据,所述排行榜配置包括每个维度的元数据对应的优先级、占位数及转换规则;

根据所述转换规则将每个维度的元数据转换成相应占位数的二进制分数;

将一个用户对应的所有二进制分数组成二进制总分数,且在所述二进制总分数中,所述二进制分数按优先级由高到低从左到右依次排列;

将所有用户的二进制总分值存入缓存,使得所述缓存对所有二进制总分值进行排序;

根据排序结果生成用户的排行榜。

优选地,

将一个用户对应的所有二进制分数组成二进制总分数,且在所述二进制总分数中,所述二进制分数按优先级由高到低从左到右依次排列具体包括:

对于一个用户,将对应的二进制分数按优先级由高到低依次累加到64位的零上,且每累加一个二进制分数后,将得到的64位数进行向左移位计算,每次移位的数量等于未累加的所有二进制分数的占位数的总和,待累加完成后,将得到的64位数作为二进制总分数。

优选地,

根据所述转换规则将每个维度的元数据转换成相应占位数的二进制分数具体包括:

根据所述转换规则将每个维度的元数据转换成二进制中间分数;

判断维度对应的所述二进制中间分数是否超过维度对应的占位数;

若超过,则将对应占位数能够表示的最大值作为二进制分数;

若不超过,则将所述二进制中间分数作为二进制分数。

优选地,

所述排行榜配置还包括排行榜的展示数量;

在将所有用户的二进制总分值存入缓存,使得所述缓存对所有二进制总分值进行排序之后,在根据排序结果生成用户的排行榜之前,所述的生成方法还包括:

从缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为所述排行榜的展示数量。

优选地,

在根据排序结果生成用户的排行榜之后,还包括:

监测所有用户的行为数据是否发生变化;

当存在用户的行为数据发生变化时,重新计算用户二进制总分数并更新排行榜。

优选地,

重新计算用户二进制总分数并更新排行榜具体包括:

重新计算行为数据发生变化的用户的二进制总分数;

判断行为数据发生变化的用户对应的原始二进制总分数是否存在所述缓存中;

若所述原始二进制总分数存在所述缓存中,则将所述原始二进制总分数替换为重新计算得到的二进制总分数,使得所述缓存对替换后的所有二进制总分数进行重新排序;

根据重新排序结果更新排行榜。

优选地,

在判断行为数据发生变化的用户对应的原始二进制总分数是否存在所述缓存中之后,还包括:

若所述原始二进制总分数不存在所述缓存中,则将重新计算得到的二进制总分数添加至所述缓存中,使得所述缓存对添加后的所有二进制总分数进行重新排序;

再从所述缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为所述排行榜的展示数量;

根据经删除操作后的重新排序结果更新排行榜。

优选地,

监测所有用户的行为数据是否发生变化具体包括:

通过消息队列订阅用户的方式监测所有用户的行为数据是否发生变化。

本申请第二方面提供一种排行榜数据的生成装置,包括:

获取单元,用于获取所有用户的行为数据及排行榜配置,所述行为数据包括多个维度的元数据,所述排行榜配置包括每个维度的元数据对应的优先级、占位数及转换规则;

转换单元,用于根据所述转换规则将每个维度的元数据转换成相应占位数的二进制分数;

构建单元,用于将一个用户对应的所有二进制分数组成二进制总分数,且在所述二进制总分数中,所述二进制分数按优先级由高到低从左到右依次排列;

保存单元,用于将所有用户的二进制总分值存入缓存,使得所述缓存对所有二进制总分值进行排序;

排行榜生成单元,用于根据排序结果生成用户的排行榜。

优选地,

所述构建单元具体用于:

对于一个用户,将对应的二进制分数按优先级由高到低依次累加到64位的零上,且每累加一个二进制分数后,将得到的64位数进行向左移位计算,每次移位的数量等于未累加的所有二进制分数的占位数的总和,待累加完成后,将得到的64位数作为二进制总分数。

优选地,

所述转换单元包括:

中间转化子单元,用于根据所述转换规则将每个维度的元数据转换成二进制中间分数;

第一判断子单元,用于判断维度对应的所述二进制中间分数是否超过维度对应的占位数;

第一确定子单元,用于当超过时,将对应占位数能够表示的最大值作为二进制分数;

第二确定子单元,用于当不超过时,则将所述二进制中间分数作为二进制分数。

优选地,

所述排行榜配置还包括排行榜的展示数量;

所述的排行榜数据的生成装置还包括:

删除单元,用于从缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为所述排行榜的展示数量。

优选地,

所述的排行榜数据的生成装置还包括:

监测单元,用于监测所有用户的行为数据是否发生变化;

更新单元,用于当存在用户的行为数据发生变化时,重新计算用户二进制总分数并更新排行榜。

优选地,

所述更新单元包括:

重新计算子单元,用于重新计算行为数据发生变化的用户的二进制总分数;

第二判断子单元,用于判断行为数据发生变化的用户对应的原始二进制总分数是否存在所述缓存中;

替换子单元,用于当所述原始二进制总分数存在所述缓存中时,将所述原始二进制总分数替换为重新计算得到的二进制总分数,使得所述缓存对替换后的所有二进制总分数进行重新排序;

排行榜更新子单元,用于根据重新排序结果更新排行榜。

优选地,

所述更新单元还包括添加单元;

所述添加单元用于当所述原始二进制总分数不存在所述缓存时,将重新计算得到的二进制总分数添加至所述缓存中,使得所述缓存对添加后的所有二进制总分数进行重新排序;

所述排行榜更新子单元还用于根据经删除操作后的重新排序结果更新排行榜。

优选地,

所述监测单元具体用于通过消息队列订阅用户的方式监测所有用户的行为数据是否发生变化。

本申请第三方面提供一种计算机可读存储介质,其特征在于,所述计算机可读存储介质用于存储程序代码,所述程序代码用于执行本申请第一方面所述的任意一种排行榜数据的生成方法。

从以上技术方案可以看出,本申请实施例具有以下优点:

本申请实施例中,提供了一种排行榜数据的生成方法,包括:从数据库中获取所有用户的行为数据及排行榜配置,行为数据包括多个维度的元数据,排行榜配置包括每个维度的元数据对应的优先级、占位数及转换规则;根据转换规则将每个维度的元数据转换成相应占位数的二进制分数;将一个用户对应的所有二进制分数组成二进制总分数,从而将多个维度的元数据转换成了一个二进制总分数,克服了缓存不能对多维度元数据进行排序的缺陷;将所有用户的二进制总分值存入缓存,因为缓存能够对存在的数据进行自动排序,所以缓存可以对所有二进制总分值进行排序;又因为在二进制总分数中,二进制分数按优先级由高到低从左到右依次排列,所以缓存在对二进制总分数排序的过程中,优先级高的二进制分数能够决定二进制总分数的排序先后,即实现了先根据优先级高的元数据进行排序的功能;最终根据排序结果生成用户的排行榜;由于排行榜的整个生成过程利用了缓存的自动排序功能,而未依赖数据库的orderby指令,所以不存在指令性能差的技术问题,并且适用于分库分表后的数据库,并适用于分库分表后的数据库;由于本申请实施例的方法适用于分库分表数据库,所以可以很好地满足游戏中多变的排行榜的可扩展需求,当增加元数据的维度时,不需重新调整数据库的结构,保证了排行榜更新的时效性。

附图说明

图1为一种排行榜的示意图;

图2为本申请实施例中排行榜数据的生成方法的第一实施例的流程图;

图3为本申请实施例中排行榜数据的生成方法的第二实施例的流程图;

图4为本申请实施例中重新计算用户二进制总分数并更新排行榜的流程示意图;

图5为本申请实施例中排行榜数据的生成装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

请参阅图1,一种排行榜的示意图。从图1中可以看出,该排行榜为直播软件中的一款游戏排行榜,具体为24小时的大神榜,该排行榜是根据24小时内用户的行为数据对游戏玩家水平进行排序,从图1中可以看出,用户的行为数据元数据包括玩家参赛次数和胜率两个维度的元数据。

目前生成该排行榜的方法主要是利用数据库的orderby指令,按照胜率和参赛次数对元数据进行排序,最终生成排行榜。

然而,发明人在研究中发现,当用户较多时,或当元数据的维度较多时,orderby指令的性能较差,从而会影响数据库的正常服务;并且,在实际应用中,为了优化数据库,通常会对数据库分库分表,但当分库分表后,orderby指令缺无法使用;另外,在游戏领域,不定时的还会增加元数据的维度,由于orderby指令在分库分表后无法使用,所以当元数据维度增加时需要修改数据库的存储结构,对线上数据影响较大。

因此,基于上述技术问题,本申请实施例提供了一种排行榜数据的生成方法,以期望能够克服orderby指令带来的缺陷。

具体地,请参阅图2,本申请实施例中排行榜数据的生成方法的第一实施例的流程图。

本申请实施例提供了一种排行榜数据的生成方法的第一实施例,包括:

步骤101,从数据库中获取所有用户的行为数据及排行榜配置,行为数据包括多个维度的元数据,排行榜配置包括每个维度的元数据对应的优先级、占位数及转换规则。

可以理解的是,用户的类型可以包括多种,例如游戏用户和直播用户;当用户为游戏用户时,行为数据可以包括游戏比赛的参与次数、游戏中的付费次数、游戏中的付费金额、游戏胜率、游戏积分、游戏时间、游戏击杀数量、助攻数量以及参团率等多个维度的元数据;当用户为直播用户时,行为数据可以包括粉丝数量、直播时间和收到的礼物数量等。

需要说明的是,排行榜不同,各维度元数据的优先级可能不同;假设用户数据包括胜率和参赛次数两个维度的元数据,在大神排行榜中,排行先后主要取决于用户的胜率,所以胜率的优先级高于参赛次数的优先级,而在劳模排行榜中,排行先后主要取决于参赛次数的多少,所以参赛次数的优先级高于胜率的优先级。

并且,在游戏领域,不同维度的元数据的数值大小也不同,甚至可能相差较大,例如,胜率一般为百分比数,数量级较小,而付费金额的数值可能是几万甚至上百万,该数量级比胜率的数量级大得多;并且,不同维度的元数据形式也可能不同,胜率的数值形式是百分比,而付费金额的数值形式是数值;基于不同维度的元数据的差异,所以本申请实施例通过转换规则将其统一转换为二进制分数。

另外,考虑到不同维度的元数据数量级差别较大,即使经过转换,转换后的数值大小也有差别,因为本申请实施例为不同维度设定相应的占位数,用相应占位数的二进制位来存储转换后的数值。

步骤102,根据转换规则将每个维度的元数据转换成相应占位数的二进制分数。

需要说明的是,每个维度的转换规则可以根据实际需要进行设定,例如转换规则可以是将十进制数值转换为二进制数值。

假设胜率对应的占位数为8位二进制,参赛次数对应的占位数为10位二进制,则64%的胜率经转换后变为00100000,参赛次数为512次经转换后变为0100000000。

步骤103,将一个用户对应的所有二进制分数组成二进制总分数,且在二进制总分数中,二进制分数按优先级由高到低从左到右依次排列。

以前述的胜率和参赛次数为例,假设胜率的优先级高于参赛次数,那么64%的胜率、参赛次数为512次的用户对应的二进制总分数则为001000000100000000,从而将各维度元数据的二进制分数转换成一个二进制总分数。

步骤104,将所有用户的二进制总分值存入缓存,使得缓存对所有二进制总分值进行排序。

可以理解的是,两个数值在比较大小时,高位的数值大,对应的二进制总分数便大,由于在二进制总分数中,二进制分数按优先级由高到低从左到右依次排列,所以本申请实施例对所有用户的二进制总分值进行排序,相当于按优先级对多维度的元数据进行排序。

步骤105,根据排序结果生成用户的排行榜。

可以理解的是,排行榜则是根据二进制总分数的排序结果生成的用户排行。

在本申请实施例中,排行榜的整个生成过程利用了缓存的自动排序功能,而未依赖数据库的orderby指令,所以不存在指令性能差的技术问题,并适用于分库分表后的数据库;由于本申请实施例的方法适用于分库分表数据库,所以可以很好地满足游戏中多变的排行榜的可扩展需求,当增加元数据的维度时,不需重新调整数据库的结构,保证了排行榜更新的时效性。

另外,由于缓存只能针对一个维度的元数据进行排序,所以本申请实施例将多个维度的元数据分别转换成二进制分数,再将这些二进制分数进行组合,形成二进制总分数,使得缓存对二进制总分数的排序,从而克服了缓存只能对一个维度的元数据进行排序的缺陷,实现对多维度的元数据进行排序。

请参阅图3,本申请实施例中排行榜数据的生成方法的第二实施例的流程图。

本申请实施例提供了一种排行榜数据的生成方法的第二实施例,包括:

步骤201,从数据库中获取所有用户的行为数据及排行榜配置,行为数据包括多个维度的元数据,排行榜配置包括排行榜的展示数量、每个维度的元数据对应的优先级、占位数及转换规则。

步骤201的内容与第一实施例中步骤101的内容相同,具体描述可以参见第一实施例中相关部分的描述,在此不再一一赘述。

步骤202,根据转换规则将每个维度的元数据转换成二进制中间分数。

步骤203,判断维度对应的二进制中间分数是否超过维度对应的占位数。

可以理解的是,由于缓存能够处理的二进制数最多为64位,所以当维度数较多时,分配给每个维度元数据的占位数有限,所以根据转换规则直接得到的二进制中间分数的位数可能超过该占位数。

假设付费金额这个维度的元数据对应的占位数为10位,在一个用户的行为数据中,付费金额为2000,而10位二进制能够表示的最大数为1024,当转换规则为将十进制数值转换为二进制数值时,付费金额2000转换成的二进制中间分数必然超过其对应的10位二进制。

步骤204,若超过,则将对应占位数能够表示的最大值作为二进制分数。

如上所述,付费金额2000转换成的二进制中间分数超过10位二进制,本申请便将10位二进制能够表示的最大数作为二进制分数,即付费金额2000对应的二进制分数为1111111111。

步骤205,若不超过,则将二进制中间分数作为二进制分数。

步骤206,对于一个用户,将对应的二进制分数按优先级由高到低依次累加到64位的零上,且每累加一个二进制分数后,将得到的64位数进行向左移位计算,每次移位的数量等于未累加的所有二进制分数的占位数的总和,待累加完成后,将得到的64位数作为二进制总分数。

可以理解的是,本申请实施例通过移位计算将所有二进制分数转换成二进制总分数,另外,由于缓存能够处理的二进制数最多为64位,所以本申请实施例将各个二进制分数先后累加到64位的零上。

例如,仍然假设64%的胜率经转换后变为00100000,参赛次数为512次经转换后变为0100000000,并假设胜率的优先级比参赛次数的优先级高。

那么将胜率对应的二进制分数累加到64位的零上,将得到0000000000000000000000000000000000000000000000000000000000100000,由于未累加的二进制数为0100000000,则向左移位10位,得到0000000000000000000000000000000000000000000000001000000000000000,然后再将未累加的二进制数0100000000累加,最终得到二进制总分数0000000000000000000000000000000000000000000000001000000100000000。

另外需要说明的是,在本申请实施例中,每次移位的数量等于未累加的所有二进制分数的占位数的总和,除此之外,每次移位的数量还可以大于未累加的所有二进制分数的占位数的总和,在之前的示例中,向左移位的数量是10位,还可以向左移11位,只要保证不同用户之间每次移位的数量相同即可。

步骤207,将所有用户的二进制总分值存入缓存,使得缓存对所有二进制总分值进行排序。

步骤207的内容与第一实施例中步骤104的内容相同,具体描述可以参见第一实施例中相关部分的描述,在此不再一一赘述。

步骤208,从缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为排行榜的展示数量。

可以理解的是,由于缓存的容量有上限,所以本申请实施例通过删除排序在后的部分二进制总数,保留在前的部分二进制总分数,在满足排行榜需求的同时,减少了内存的占用。

步骤209,根据排序结果生成用户的排行榜。

步骤209的内容与第一实施例中步骤105的内容相同,具体描述可以参见第一实施例中相关部分的描述,在此不再一一赘述。

步骤210,监测所有用户的行为数据是否发生变化。

需要说明的是,可以通过消息队列订阅用户的方式监测所有用户的行为数据是否发生变化。

步骤211,当存在用户的行为数据发生变化时,重新计算用户二进制总分数并更新排行榜。

需要说明的是,重新计算用户二进制总分数并更新排行榜的方式有很多,例如,可以重新计算所有用户的二进制总分数,为了提高排行榜的更新速度,本申请实施例采用增量计算的方式更新排行榜。具体请参阅图4,本申请实施例中重新计算用户二进制总分数并更新排行榜的流程示意图。

如图4所示,重新计算用户二进制总分数并更新排行榜具体包括:

步骤301,重新计算行为数据发生变化的用户的二进制总分数。

例如,如果有两个用户的行为数据发生变化,本申请实施例则只重新计算这两个用户的二进制总分数。

步骤302,判断行为数据发生变化的用户对应的原始二进制总分数是否存在缓存中。

步骤303,若原始二进制总分数存在缓存中,则将原始二进制总分数替换为重新计算得到的二进制总分数,使得缓存对替换后的所有二进制总分数进行重新排序。

这里假设一个用户的原始二进制总分数存在缓存中,且排名第8位,重新计算得到的该用户的二进制总分数比原始二进制总分数还高,如果直接将重新计算得到的二进制总分数放入缓存中排序,最终生成的排行榜中出现两次该用户,因此本申请实施例用重新计算得到的二进制总分数替换原始二进制总分数。

步骤304,根据重新排序结果更新排行榜。

步骤305,若原始二进制总分数不存在缓存中,则将重新计算得到的二进制总分数添加至缓存中,使得缓存对添加后的所有二进制总分数进行重新排序。

步骤306,再从缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为排行榜的展示数量。

可以理解的是,在本申请实施例中,为了尽可能占用更少的内存,则重新排序后,对多余的二进制总分数进行删除。

步骤307,根据经删除操作后的重新排序结果更新排行榜。

请参阅图5,本申请实施例中排行榜数据的生成装置的结构示意图。

本申请实施例供一种排行榜数据的生成装置的一个实施例,包括:

获取单元401,用于获取所有用户的行为数据及排行榜配置,行为数据包括多个维度的元数据,排行榜配置包括每个维度的元数据对应的优先级、占位数及转换规则;

转换单元402,用于根据转换规则将每个维度的元数据转换成相应占位数的二进制分数;

构建单元403,用于将一个用户对应的所有二进制分数组成二进制总分数,且在二进制总分数中,二进制分数按优先级由高到低从左到右依次排列;

保存单元404,用于将所有用户的二进制总分值存入缓存,使得缓存对所有二进制总分值进行排序;

排行榜生成单元405,用于根据排序结果生成用户的排行榜。

进一步地,构建单元403可以具体用于:

对于一个用户,将对应的二进制分数按优先级由高到低依次累加到64位的零上,且每累加一个二进制分数后,将得到的64位数进行向左移位计算,每次移位的数量等于未累加的所有二进制分数的占位数的总和,待累加完成后,将得到的64位数作为二进制总分数。

进一步地,转换单元402可以包括:

中间转化子单元,用于根据转换规则将每个维度的元数据转换成二进制中间分数;

第一判断子单元,用于判断维度对应的二进制中间分数是否超过维度对应的占位数;

第一确定子单元,用于当超过时,将对应占位数能够表示的最大值作为二进制分数;

第二确定子单元,用于当不超过时,则将二进制中间分数作为二进制分数。

进一步地,排行榜配置还包括排行榜的展示数量;

排行榜数据的生成装置还可以包括:

删除单元,用于从缓存中删除部分二进制总分数,以保留排序在前的n个二进制总分数,其中n为排行榜的展示数量。

进一步地,排行榜数据的生成装置还可以包括:

监测单元,用于监测所有用户的行为数据是否发生变化;

更新单元,用于当存在用户的行为数据发生变化时,重新计算用户二进制总分数并更新排行榜。

进一步地,更新单元可以包括:

重新计算子单元,用于重新计算行为数据发生变化的用户的二进制总分数;

第二判断子单元,用于判断行为数据发生变化的用户对应的原始二进制总分数是否存在缓存中;

替换子单元,用于当原始二进制总分数存在缓存中时,将原始二进制总分数替换为重新计算得到的二进制总分数,使得缓存对替换后的所有二进制总分数进行重新排序;

排行榜更新子单元,用于根据重新排序结果更新排行榜。

进一步地,更新单元还可以包括添加单元;

添加单元用于当原始二进制总分数不存在缓存时,将重新计算得到的二进制总分数添加至缓存中,使得缓存对添加后的所有二进制总分数进行重新排序;

排行榜更新子单元还用于根据经删除操作后的重新排序结果更新排行榜。

进一步地,监测单元可以具体用于通过消息队列订阅用户的方式监测所有用户的行为数据是否发生变化。

本申请实施例还提供一种计算机可读存储介质,计算机可读存储介质用于存储程序代码,程序代码用于执行本申请实施例中的任意一种排行榜数据的生成方法。

以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

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