首页> 中国专利> 排行榜生成方法、装置、服务器及存储介质

排行榜生成方法、装置、服务器及存储介质

摘要

本申请公开了排行榜生成方法、装置、服务器及存储介质,涉及计算机技术领域。该方法包括:从数据库中读取各个元素各自对应的元素分数,元素分数由至少两个排序维度对应的排序维度值构成,且排序维度值在元素分数中的顺序基于排序维度在排序规则中的优先级确定;基于元素分数对数据库中的元素进行排序,其中,排序后的元素符合排序规则;响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。采用本申请实施例提供的方案,无需借助其他关系型数据库,可以直接基于至少两个排序维度的排序维度值对元素进行排序,提高了元素排序的效率,且降低了成本投入。

著录项

  • 公开/公告号CN113239084A

    专利类型发明专利

  • 公开/公告日2021-08-10

    原文格式PDF

  • 申请/专利权人 广州市百果园信息技术有限公司;

    申请/专利号CN202110535261.3

  • 发明设计人 邓辉超;

    申请日2021-05-17

  • 分类号G06F16/2457(20190101);G06F16/248(20190101);H04N21/258(20110101);

  • 代理机构11138 北京三高永信知识产权代理有限责任公司;

  • 代理人邢少真

  • 地址 511402 广东省广州市番禺区市桥街兴泰路274号C栋西塔5-13层

  • 入库时间 2023-06-19 12:10:19

说明书

技术领域

本申请实施例涉及计算机技术领域,特别涉及一种排行榜生成方法、装置、服务器及存储介质。

背景技术

排行榜是将一些数据或元素按一定的标准进行排列,以便研究者通过浏览排序结果发现一些明显的特征或趋势,以解决相应问题。除此之外,排行榜还有助于对数据进行统计,以及为重新归类或分组等提供方便。以直播打赏为例,主播端或观众端可以通过礼物排行榜查看观众打赏的虚拟礼物数量和排名信息。

相关技术中,在对礼物排行榜进行排名时,通常按照打赏主播虚拟礼物的数量进行排名,并显示对应的观众帐号信息及排名情况,当打赏虚拟礼物数量相同时,则根据对应帐号等级进行排序。

发明内容

本申请实施例提供了一种排行榜生成方法、装置、服务器及存储介质。所述技术方案如下:

一方面,本申请实施例提供了一种排行榜生成方法,所述方法包括:

从数据库中读取各个元素各自对应的元素分数,所述元素分数由至少两个排序维度对应的排序维度值构成,且所述排序维度值在所述元素分数中的顺序基于所述排序维度在排序规则中的优先级确定;

基于所述元素分数对所述数据库中的元素进行排序,其中,排序后的元素符合所述排序规则;

响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

另一方面,本申请实施例提供了一种排行榜生成装置,所述装置包括:

读取模块,用于从数据库中读取各个元素各自对应的元素分数,所述元素分数由至少两个排序维度对应的排序维度值构成,且所述排序维度值在所述元素分数中的顺序基于所述排序维度在排序规则中的优先级确定;

排序模块,用于基于所述元素分数对所述数据库中的元素进行排序,其中,排序后的元素符合所述排序规则;

反馈模块,用于响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

另一方面,本申请实施例提供了一种服务器,所述直播服务器包括处理器和存储器,所述存储器中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以实现上述方面所述的排行榜生成方法。

另一方面,本申请实施例提供了一种计算机可读存储介质,所述存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如上述方面所述的排行榜生成方法。

另一方面,本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面提供的排行榜生成方法。

本申请实施例提供的技术方案带来的有益效果至少包括:

数据库在对元素进行排序时,基于各个元素的至少两个排序维度确定对应的排序维度值,并按照排序维度的优先级将排序维度值组成元素的元素分数,进而基于元素分数的数值,并按照排序规则将数据库中的元素进行排序,便于接收到排行榜生成请求时,生成元素的排行榜;采用本申请实施例提供的方案,无需借助其他关系型数据库,可以直接基于至少两个排序维度的排序维度值对元素进行排序,提高了元素排序的效率,且降低了成本投入。

附图说明

图1示出了本申请一个示例性实施例提供的排行榜生成方法的场景示意图;

图2是本申请一个示例性实施例提供的排行榜生成方法的流程图;

图3示出了本申请一个示例性实施例提供的score的排序维度划分示意图;

图4是本申请另一个示例性实施例提供的排行榜生成方法的流程图;

图5是本申请一个示例性实施例提供的对score中各个排序维度所在比特位的划分示意图;

图6是本申请另一个示例性实施例提供的排行榜生成方法的流程图;

图7示出了本申请一个示例性实施例示出的基于更新数据和第一目标排序维度值计算第二目标排序维度值的示意图;

图8示出了本申请一个示例性实施例提供的元素分数更新过程的算法流程图;

图9示出了本申请一个示例性实施例提供的从元素分数中读取目标排序维度值的示意图;

图10是本申请另一个示例性实施例提供的排行榜生成方法的流程图;

图11是本申请另一个示例性实施例提供的排行榜生成方法的流程图;

图12是本申请一个示例性实施例提供的排行榜生成装置的结构框图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步的详细描述。

在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

远程字典服务:远程字典服务(Remote Dictionary Server,Redis)是一种使用C语言开发的一个开源的高性能基于内存运行的键值Key-Value数据库,和分布式的高速缓存系统Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。这些数据类型都支持push/pop(入栈/出栈)、add/remove(添加/移除)及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

有序集合:有序集合ZSet是Redis里面的一种支持排序的集合数据结构,该数据结构包含分数score和值value两个属性。该数据结构会保证集合元素始终按score排序,有序集合和集合一样也是string类型元素的集合,且不允许重复的成员;Redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复,被广泛使用在各种排行榜等业务场景中。

比较并交换:比较并交换(Compare And Swap/Set,CAS)是一种用在并发编程中的乐观锁实现机制,CAS算法包含三个参数CAS(V,E,N)。V表示要更新的变量(内存值),E表示预期值(旧的值),N表示新值。当且仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做,最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的(乐观锁),它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。

Lua:是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。Lua不仅仅作为扩展脚本,也可以作为普通的配置文件,代替可扩展标记语言XML和初始化文件ini等文件格式,并且更容易理解和维护。Reids 2.6版本增加了对Lua的支持,通过内嵌对Lua环境的支持,Redis解决了长久以来不能高效地处理CAS命令的缺点,并且可以通过组合使用多个命令,这些命令被原子性地执行,轻松实现以前很难实现或者不能高效实现的功能。

相关技术中,当需要对Redis数据库中的元素进行排序和更新时,需要获取ZSet数据结构中的每个元素的score和value的值,其中,score用于表示元素的排序分数,而value则用于表示元素的标识信息,以Redis数据库应用于直播平台为例,如主播在直播过程中实时接收观众打赏的虚拟礼物,并通过打赏榜单显示观众的榜单排名情况及赠送的虚拟礼物的分数,通常情况下,通过Redis数据库对各种元素进行处理时,可以将score的整数部分及小数部分分别来保存观众打赏主播的虚拟礼物数量值和观众帐号等级值,并以此计算score的数值,value则用来保存观众帐号,通过Redis数据库实时排序和更新主播终端显示的榜单排名情况。

通过ZSet的score对虚拟礼物数量及帐号等级的排名虽然可以实现两个维度的排名,但无法实现更多维度的元素排序,如两个帐号等级相同的观众向主播打赏的虚拟礼物相同时,通过ZSet的score计算的得分是相同的,即得到的排名也是相同的,为了更加精确的对观众帐号进行排名,还可以根据打赏虚拟礼物的时间进行排序,即对于相同分数和相同等级的帐号,则将先打赏虚拟礼物的帐号排在更靠前的位置。但由于score的整数部分和小数部分只能表示两个排序维度,当需要对超过两个排序维度的元素进行排序时,需要借助具备关系型数据库才能实现。但此种方式对资源浪费较大,同时牺牲了Redis本身的性能优势以及ZSet提供的遍历的命令,实现成本过高。

为了实现多维度元素的排序,本申请实施例中,通过Redis数据库对元素进行排序时,在原有ZSet数据结构的基础上,构造一种全新的增强型数据结构,增强型数据结构保存的数据类型和ZSet相同,即根据score的字节类型(ZSet的score是一个double类型,二进制位长度为64比特位)为每个维度分配一定的二进制位数,并将多个维度的数值用一个score进行表示,并将整合后的score写入ZSet中,进而基于score数值的大小进行排序,生成关于value的排行榜。该方法可以应用于具有数据处理的服务器或计算机设备等具有较强数据处理能力的设备,本申请实施例并对具体设备类型进行限定,且为了方便描述,下述各个实施例以模型训练方法应用于服务器为例进行说明。

请参考图1,其示出了本申请一个示例性实施例提供的实施环境的示意图。该实施环境可以包括:终端110和服务器120。

终端110中安装有显示排行榜的应用程序,终端110可以是诸如手机、台式电脑、平板电脑、多媒体播放设备和膝上型便携计算机等电子设备。排行榜应用程序可以是直播类应用程序、音乐类应用程序、新闻类应用程序等,通过该应用程序可以显示对应的排行榜信息,如直播类应用程序显示送礼排行榜、音乐类应用程序显示音乐播放量排行榜以及新闻类应用程序显示点击量排行榜等。本实施例中,以直播类应用程序为例,用户使用终端110观看直播时,可以通过点击礼物排行榜,向服务器120发送排行榜生成请求,获取送礼数量及排名信息。此外,终端110还可以向对应主播帐号转移虚拟资源,向主播打赏虚拟礼物。

终端110通过无线网络或有线网络与服务器120相连。

服务器120包括一台服务器、多台服务器、云计算平台和虚拟化中心中的至少一种。服务器120为终端110中的应用程序提供后台服务。例如,服务器120可以是上述所说的应用程序的后台服务器。本申请实施例中,服务器120运行有数据库121,如Redis数据库,数据库121中保存有各种元素,如主播帐号和观众帐号的帐号信息,观众帐号打赏给主播的虚拟礼物的数量等。服务器120还用于接收终端110的排行榜生成请求,向终端110反馈实时排行榜信息,此外,服务器120还可以接收终端110发送的虚拟资源转移指令,向主播转移虚拟资源。

本领域技术人员可以知晓,上述终端的数量可以更多或更少。比如上述终端可以仅为一个,或者上述终端为几十个或几百个,或者更多数量。本申请实施例对终端的数量和设备类型不加以限定。

请参考图2,其示出了本申请一个示例性实施例提供的排行榜生成方法的流程图,本实施例以该方法应用服务器为例进行说明,该方法可以包括如下步骤。

步骤201,从数据库中读取各个元素各自对应的元素分数,元素分数由至少两个排序维度对应的排序维度值构成,且排序维度值在元素分数中的顺序基于排序维度在排序规则中的优先级确定。

Redis数据库中保存有服务器接收到的各个元素及元素对应的元素分数,元素是用于识别数据库保存的各个数据的标识信息,如帐号信息,元素分数是元素在至少两个排序维度下的排序维度值组成的一组数值,且排序维度值按照一定的优先级顺序组成元素分数,对元素进行排序时按照元素分数的高低进行排序。

服务器获取元素分数时,根据数据库规定元素分数的数据类型确定出元素分数的字节长度,即能够表示成二进制数的比特位数,该二进制值的不同比特位被划分为不同排序维度的表示区域,以Redis数据库为例,有序集合ZSet中包含有score和value两个属性,通常value用于保存元素,score用于保存元素分数,且元素和元素分数是关联存储在数据库中的,score是一个双精度浮点型数据,二进制长度为64个比特位,不同排序维度的排序维度值在元素分数中表示的位置并不相同,优先级越高的排序维度,其对应的排序维度值则在64个比特位中越靠前的位置。

示意性的,对于直播过程中的礼物排行榜,需要获取的排序维度包括分数维度,帐号等级维度及时间戳维度,分数维度表示打赏给主播的虚拟礼物的数量,在排行榜中用于表示观众帐号的分数,帐号等级维度表示观众帐号的等级,时间戳维度表示从固定时间(1970年)到打赏虚拟礼物对应时间的总秒数值。

如图3所示,score是中保存的64位元素分数被划分成3个维度区域,其中分数维度的优先级最高,相应的分数维度值在最靠前的位置,依次为等级维度和时间戳维度,由于score的二进制数的最高位表示符号位,因此,上图表示出的是score的第0位至第63位,第64位符号位并未示出。

需要说明的是,在初始化Redis数据库时,可以根据实际需要设置元素分数的排序维度,如需要根据观众帐号打赏虚拟礼物的分数、等级和时间戳进行排序时,可以分别设置分数维度、等级维度和时间戳维度,并基于各种排序维度确定各自对应的排序维度值;如还需要根据观众帐号是否为主播的粉丝来进行排名时,即相同分数和等级条件下,粉丝帐号排名在前,则在对数据库进行初始化时,设置4个排序维度,并对每个排序维度设置排序优先级,进而计算对应元素分数。

步骤202,基于元素分数对数据库中的元素进行排序,排序后的元素符合排序规则。

当服务器获取到元素的元素分数后,确定64位二进制数的数值,并按照元素值的大小对元素进行排序,如按照元素分数的数值大小进行降序规则排序或升序规则进行排序。

步骤203,响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

当服务器接收到终端发送的排行榜生成请求时,从数据库中获取排序后的元素,并基于排序后的元素获取对应的标识信息,将对应的标识信息按照元素分数的排序规则进行排名,生成元素排行榜,进一步地,将元素排行榜反馈给终端。

在一种可能的实施方式中,当用户不需要基于设定的排序规则获取所述库中所有元素的排名时,还可以通过设置排序维度的阈值来筛选满足条件的元素。如用户只希望对分数值在100分以上的元素进行排名时,服务器在获取到元素和对应的元素分数后,筛选分数维度值在100分以上的元素,并将筛选后的元素分数按照排序规则生成排行榜,并发送至终端。

综上所述,本申请实施例中,数据库在对元素进行排序时,基于各个元素的至少两个排序维度确定对应的排序维度值,并按照排序维度的优先级将排序维度值组成元素的元素分数,进而基于元素分数的数值,并按照排序规则将数据库中的元素进行排序,便于接收到排行榜生成请求时,生成元素的排行榜;采用本申请实施例提供的方案,无需借助其他关系型数据库,可以直接基于至少两个排序维度的排序维度值对元素进行排序,提高了元素排序的效率,且降低了成本投入。

在一种可能的实施方式中,主播通过终端进行网络直播,观众向主播打赏虚拟礼物,当服务器接收到观众帐号发送的虚拟资源转移指令后,需要根据虚拟资源指令确定需要打赏给主播的虚拟礼物的数量,相应的数据库中保存的排序顺序相应的也会发生变化,当服务器接收到分数更新请求时,需要基于更新数据对各种元素重新进行排序。

请参考图4,其示出了本申请另一个示例性实施例提供的排行榜生成方法的流程图,本实施例以该方法应用服务器为例进行说明,该方法可以包括如下步骤。

步骤401,从数据库中读取各个元素各自对应的元素分数,元素分数由至少两个排序维度对应的排序维度值构成,且排序维度值在元素分数中的顺序基于排序维度在排序规则中的优先级确定。

当服务器从Redis数据库中获取各个元素各自对应的元素分数后,需要确定元素分数的各个排序维度,由于元素分数由64比特位的二进制数表示,因此不同的比特位可以用于表示不同的排序维度,当元素分数是根据分数排序维度、等级排序维度及时间戳排序维度确定时,Redis数据库可以提前设定的排序规则确定元素分数的不同比特位来表示对应的排序维度,并按照排序维度的优先级将各种排序维度值组成元素分数。

由于score可以表示64为的二进制数,除最高位的符号位外,可以将该二进制数的第0比特位至第62比特位划分为多个排序维度,且将第n排序维度的优先级设置为高于第n+1排序维度的优先级,且第n排序维度对应的比特位高于第n+1排序维度对应的比特位。即排序维度的优先级越高,对应的排序维度值相应占据元素分数的越高的比特位,因此,元素分数按照比特位高低顺序从左往右依次为第一排序维度对应的排序维度值、第二排序维度对应的排序维度、第三排序维度对应的排序维度值。只要所有排序维度所需的二进制位数总和不超过score所能表示的最多二进制数,即可将多个排序维度的排序值组成元素的元素分数。

通常情况下,对排行榜中观众帐号进行排序时,根据观众帐号打赏虚拟礼物的多少进行排序,即打赏虚拟礼物越多,获得的分数就越高,对应排名就越靠前;当出现不同帐号打赏虚拟礼物的数量相同时,则按照帐号等级高低进行排序,相同分数的帐号,帐号等级越高则排名越靠前;当帐号等级也相同时,则按照打赏虚拟礼物的时间戳进行排名,即打赏虚拟礼物的时间越靠前,则相应排名就越靠前。

如图5所示,当Redis数据库对直播过程中的观众帐号进行排序时,将score的第0比特位到第38比特位之间的39个比特位设置为时间戳维度的表示范围;将第39比特位至第42比特位之间的4个比特位设置为等级维度的表示范围;将第43比特位至第62比特位之间的20个比特位设置为分数维度的表示范围。其中,第63比特位表示符号位,不划分排序维度。

在对Redis数据库进行初始化时,构造的增强型数据结构的数据接口通过构造器配置各个排序维度、排序维度对应二进制数的位数和各个排序维度的排序方式。并调用函数进行配置校验,同时初始化后续需要使用的各个排序维度的排序规则等。

在一个示例性的例子中,对Redis数据库进行初始化的实现代码可以表示如下:

当对Redis数据库进行初始化后,即可将数据库中保存的各种元素对应的各种排序维度值组成元素分数,并进行排序。

需要说明的是,当需要改变数据库中元素的排序维度的个数和比特位时。仅需通过构造器重新对score的二进制数的比特位进行划分即可,可移植性和适配性较好,且无需重新对数据库程序内容进行修改,减少了对应用程序的维护成本。

步骤402,响应于分数更新请求,获取更新数据。

Redis数据库实时对数据库中的所有元素进行排序,且当数据库中的元素出现增减或更新时,都需要重新对元素排名进行更新。当服务器接收到分数更新请求时,获取对应的更新数据,并基于更新数据重新计算元素的元素得分,并按照排序规则进行排序。

示意性的,当观众在观看直播过程中向主播赠送虚拟礼物时,服务器会基于虚拟礼物的数量、帐号等级和时间戳重新计算当前观众帐号对应的分数,并基于得分更新排行榜的排名情况。

步骤403,确定更新数据对应的目标排序维度,以及目标排序维度对应的目标比特位。

服务器获取到的更新数据中至少包含有两个排序维度的数据,不同排序维度都会对应有各自的排序维度值。当接收到更新数据后,确定该更新数据对应的目标排序维度,并基于目标排序维度确定对应的排序维度值。

由于对数据库进行初始化时已经设置不同排序维度在元素分数中表示的目标比特位,因此,当数据库确定更新数据对应的目标排序维度后,会基于目标排序维度的优先级和排序规则确定对应的目标比特位。

示意性的,当观众向主播赠送虚拟礼物时,服务器基于更新数据确定出分数维度对应的分数值,分数维度对应的目标比特位是score的第43比特位至第62比特位之间的20个比特位;且通过观众帐号确定出等级维度对应的帐号等级,等级维度对应的目标比特位是score的第39比特位至第42比特位之间的4个比特位;相应的,可以基于获取到该更新数据的时间确定出时间戳维度对应的时间戳,时间戳维度对应的目标比特位是score的第0比特位到第38比特位之间的39个比特位。

步骤404,基于更新数据对目标比特位中的目标排序维度值进行更新。

当Redis数据库确定出更新数据的各个目标排序维度值及目标比特位后,即可对目标元素的元素分数进行更新。

Redis数据库中保存有大量的元素及对应的元素分数,在一种可能的情况下,数据库在同一时刻可能会接收到对同一元素的多条更新请求,即数据库会对所有更新请求分别发起多个更新线程,但由于不同线程对更新数据的计算时间各不相同,这样会导致多个线程分别基于各自的计算结果重复多次写入更新后的元素分数,且无法保证更新后的准确性。

示意性的,服务器在同一时间内接收到帐号A和帐号B分别向主播帐号赠送10个和20个虚拟礼物,对应的分数值为10和20,假设数据库中记录主播当前虚拟礼物对应的分数为100,服务器会同时基于两个帐号开启两条线程,并分别计算虚拟礼物的分数,第一线程和第二线程在计算虚拟礼物数值前从数据库中读取分数值为100,第一线程基于帐号A赠送虚拟礼物的分数计算出更新后分数为110,相应的第二线程基于帐号B赠送虚拟礼物的分数计算出更新后分数为120,由于第一线程和第二线程的计算时间可能并不相同,因此计算后写入更新分数的顺序也不相同,当第二线程先计算出更新后的分数,因而将数据库中的分数更新为120,然后第一线程计算出分数为110,进而再次将分数由120更新为110,此时主播帐号对应虚拟礼物的分数为110,即更新结果取决于最后计算出更新分数的线程,但实际上更新后的分数应该为两个帐号赠送虚拟礼物的总和,对应分数为130。

因此,为防止多线程并发更新导致数据错误,在对数据库中元素的元素分数进行更新时,需要确定元素分数是否已经被其他线程更新,避免出现错误更新。如图6所示,步骤404还包括如下步骤。

步骤404A,从目标比特位中读取第一目标排序维度值。

服务器确定目标排序维度后,根据更新数据中包含的标识信息确定数据库中对应元素的元素分数。在对元素分数进行更新时,为避免多线程写入更新错误,需要先获取元素分数,并按照不同的排序维度从目标比特位中读取第一目标排序维度值,如从第42比特位至第62比特位读取分数维度的排序维度值。

步骤404B,基于更新数据和第一目标排序维度值计算第二目标排序维度值。

由于元素分数由多个排序维度值组成,其中包含元素的实际分数和虚拟分数,实际分数是用于显示元素排名的关键数值,在元素分数中对应为第一排序维度值,而虚拟分数是为实现排序方便而设置的非关键数值,在元素分数中对应为第n排序维度值,其中n是大于等于2的正整数。如直播过程中,虚拟礼物的分数是关键数值,帐号等级和时间戳则是非关键数值。

在对元素分数进行更新时,对于不同排序维度的更新方式也不相同,对实际分数更新采用累计的方式,而虚拟分数更新则采用替换的方式。如直播过程中的礼物排行榜中,第一排序维度值是观众帐号打赏的分数,而用户等级和时间戳是第n排序维度值,对相应元素分数进行更新时,分数是在原有的基础上进行累加,表示观众帐号打赏虚拟礼物的分数,而等级维度值和时间戳维度值是根据每次打赏虚拟礼物的帐号等级和时间确定的,每次更新时都需要替换原来的排序维度值。

当确定出第一目标排序维度值后,将更新数据对应的排序维度值与第一目标排序维度值相加或替换,计算出第二目标排序维度值,得到计算后的元素分数。

示意性的,如图7所示,分数维度对应的目标比特位是score的第43比特位至第62比特位之间的20个比特位,对应的第一目标排序维度值(分数排序维度值)为1,当更新数据对应的加分值是1时,则计算得到对应的第二目标排序维度值是2;第39比特位至第42比特位表示的是等级维度,对应的第一目标排序维度值(等级维度值)是2,更新数据对应的等级维度值是8,则计算后对应的第二目标排序维度值替换为8;相应地,第0比特位到第38比特位表示的时间戳维度值也进行相应替换,最终得到计算后的元素分数。

步骤404C,再次从目标比特位中读取第三目标排序维度值。

为了避免更新元素分数时出现错误,在计算出而第二目标排序维度值后,还需要再次获取元素分数,并根据排序维度,从对应目标比特位中读取第三目标排序维度值,并比较前后两次读取到的对应目标比特位的第一目标排序维度值与第三目标排序维度值是否相同。

步骤404D,响应于第三目标排序维度值与第一目标排序维度值相同,将第二目标排序维度值更新至目标比特位。

当前后两次读取到第三目标排序维度值与第一目标排序维度值相同时,说明在计算元素分数过程中,数据库中对应元素分数并未被其他线程更新,此时可以将第二排序维度值更新至元素分数对应的目标比特位。

当前后两次读取到第三目标排序维度值与第一目标排序维度值不相同时,说明在计算元素分数过程中,数据库中对应元素分数并被其他线程更新,不能将第二目标排序维度更新至元素分数对应的目标比特位,否则会导致更新错误。此时可以再次读取元素分数,并按照最新的元素分数重新计算并更新。

在一个示例性的例子中,对元素分数进行更新过程的实现代码可以表示如下:

其中,Redis数据库通过ZSet读取元素分数,并将更新后的元素分数重新写入ZSet中,通过设置CAS循环,并使用Lua脚本实现CAS操作,确保元素分数能够正确写入。图8示出了通过CAS操作对元素分数更新过程的算法流程图。

当服务器接收到分数更新请求时,Redis数据库根据获取到的更新数据,读取ZSet中保存的value的值,当value的值与更新数据相匹配时,读取score中的对应的元素分数。

在Redis数据库读取到元素分数后,根据更新数据中各个排序维度确定排序维度值对应在元素分数中的目标比特位,并将排序维度值转化为二进制数与元素分数的目标比特位相加或替换,计算出实际的元素分数。

为了避免数据库出现多线程数据更新导致更新错误,当计算出实际元素分数后,需要通过CAS操作,再次从数据库中读取ZSet中保存的score的值,若读取到score的值与第一次读取到的数值相同,则表示在计算实际元素分数的时间内,score的数值没有被其他线程更新,计算的实际元素分数即为更新后的元素分数,可以结束本次CAS进程。当再次读取到的score的值与第一次读取到的数值不同,表明在计算实际元素分数的时间内,score的数值已经被其他线程更新,此时计算的实际元素分数是错误的,重新读取ZSet中的元素分数,并重新进行CAS操作,直至完成更新。

步骤405,基于元素分数对数据库中的元素进行排序,其中,排序后的元素符合排序规则。

当服务器基于更新数据对数据库中元素对应的元素分数进行更新后,基于预设的排序规则重新对元素进行排序。

步骤406,响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

当服务器接收到排行榜生成请求时,获取数据库中元素和对应元素分数,并基于元素分数确定元素的排名。但由于终端或计算机需要显示排行榜时,可能需要显示指定排序维度的元素信息,或指定排名内的元素信息,如直播过程中的礼物排行榜需要显示前100名观众帐号的分数和帐号等级等信息。因此,服务器在向终端或计算机进行反馈时,需要从目标元素分数中读取规定数量的目标排序维度的目标排序维度值,并基于目标排序维度值生成排行榜。因此,如图6所示,步骤406还包括如下步骤。

步骤406A,响应于排行榜生成请求,从排序后的元素中确定目标元素。

当服务器接收到排行榜生成请求后,根据排行榜生成请求确定出需要显示的各种排序信息,并从排序后的元素中确定出目标元素。

示意性的,在直播过程中,当主播或观众需要查看排行榜信息时,通过向服务器发送排行榜生成请求,显示前100名观众帐号的打赏情况,则服务器需要从数据库中筛选出排名在前100名的目标元素。

步骤406B,从目标元素对应的目标元素分数中读取目标排序维度的目标排序维度值。

当数据库筛选出对应的目标元素后,由于元素分数是由不同排序维度对应的排序维度值组成的,因此,在显示排行榜时,还需要从元素分数读取对应各个目标排序维度的目标排序维度值。

步骤406C,基于目标元素和目标排序维度值生成排行榜,并进行反馈。

当服务器根据目标排序维度从目标比特位中读取出对应的目标排序维度值后,基于各个元素的排名情况和对应的目标排序维度值生成排行榜,并进行反馈。

但由于数据库中的元素可能包含有多种排序维度,不同的排序维度采用的排序规则并不相同,如在礼物排行榜中,打赏主播虚拟礼物的分数采用正序排序,等级同样采用正序排序,但是时间戳表示的是1970年到接收更新数据的总秒数,因此,先打赏虚拟礼物的时间戳数的数值相对较小,时间戳维度需要按照倒序排序的方式。在显示元素排行榜时,时间维度对应的分数才是观众或主播重点关注的信息,因此,分数情况才是目标元素需要显示的实际数据,而等级信息和时间戳信息是可选的显示信息。因此,在显示排行榜时,还需要根据排序维度读取各个排序维度值,步骤406C还包括如下步骤。

步骤406C1,响应于目标排序维度为正序排序,基于目标排序维度值确定目标排序维度的实际数据。

当目标排序维度为正序排序时,从二进制表示的元素分数中读取对应目标排序维度值,如图9所示,分数维度值占据元素分数的第43比特位至第62比特位,而除去分数维度外的其他维度值占据元素分数的第0位至第42位,因此,将读取到的二进制数右移43个比特位,将分数维度对应的20个比特位移至第0位至第19位,高位补零。获得的数值即为目标维度的实际数据,即观众帐号对应的分数。同样的道理,对于等级维度值,可以通过与运算或移位的方式读取对应观众帐号的等级。

步骤406C2,响应于目标排序维度为倒序排序,基于目标排序维度值以及目标排序维度的最大排序维度值,计算目标排序维度的实际数据。

在一种可能的实施方式中,当排行榜需要根据时间规则计算排名时,则需要将目标排序维度值设置为倒序,如在答题活动中,需要统计每个抢答帐号的抢答时间,按照抢答的时间顺序进行排序,对应的目标排序维度的实际数据就是时间信息。

为了能够确保时间越靠前的元素分数越大,便于对元素进行正确的排序,可以通过设置最大排序维度值,并通过作差的方式表示相应的排序维度值,如更新数据对应的时间戳为1234678,则对应的二进制表示为000000000000000101111000110000101001110,为了能够将该时间戳在元素分数中按照数值高低进行排序,将39个比特位能够表示的最大排序维度值与该时间戳相减,并把得到的数值作为时间戳维度值,其计算过程可以表示为:111111111111111111111111111111111111111–000000000000000101111000110000101001110=111111111111111010000111001111010110001,由此可见,时间戳数值越大,表示时间越靠后,与最大排序维度值作差获得的排序维度值相对越小,可以按照数值的大小准确表示元素的排名情况。当需要从元素分数中读取正确的时间信息时,首先读取对应目标比特位中的排序维度值,进而通过与最大排序维度值作差即可获得元素的实际数据。同样的道理,对于帐号等级同样可以对二进制数进行位运算获取。

在一个示例性的例子中,通过元素分数获取对应目标排序维度值的实现代码可以表示如下:

程序代码在执行时,按照计算机读取二进制数的顺序从后往前依次读取,然后通过位运算得到相应的值。

步骤406C3,基于目标元素和目标排序维度值生成排行榜,并进行反馈。

当确定出目标元素和对应目标排序维度值后,生成关于目标元素和目标排序维度值的排行榜信息,并将排行榜发送至对应终端。

可选的,服务器可以根据排行榜生成请求在排行榜中显示目标排序维度值或所有排序维度的排序维度值,如用户可以指定在排行榜中显示观众帐号、观众帐号对应的分数以及帐号的等级信息,此外,还可以显示观众帐号最后一次打赏虚拟礼物的时间等。

本申请实施例中,当服务器接收到分数更新请求时,通过确定更新数据的各个目标排序维度以及对应的目标比特位,进而从元素分数的目标比特位中读取出第一目标排序值,便于根据更新数据和第一目标排序维度之计算出第二目标排序维度值。

在写入计算的第二目标排序维度值前,通过再次读取目标比特位中第三目标排序维度值,并与计算的第二目标排序维度值比较,将第二目标排序维度值更新至目标比特位中,完成对元素分数的更新,且提高了元素分数更新的准确性。

此外,当服务器接收到排行榜生成请求时,可以直接从数据库中读取已经按照排序规则进行排序的目标元素,并读取元素分数中对应目标排序维度的实际数据,生成目标元素和目标排序维度值生成排行榜,进行反馈,实现了元素的多维度排序。

由上述实施可知,更新数据是基于score中的保存的value值对元素进行匹配,当更新数据的标识信息与ZSet读取到的value相同时,指示更新数据是对应数据库中的目标元素进行更新。但在一种可能的实施方式中,数据库中可能不包含更新数据所对应的元素,即更新数据是需要添加进数据库中新元素,并对添加新元素后的所有元素进行排序。

请参考图10,其示出了本申请另一个示例性实施例提供的排行榜生成方法的流程图,本实施例以该方法应用服务器为例进行说明,该方法可以包括如下步骤。

步骤1001,从数据库中读取各个元素各自对应的元素分数,元素分数由至少两个排序维度对应的排序维度值构成,且排序维度值在元素分数中的顺序基于排序维度在排序规则中的优先级确定。

本步骤的实施方式可以参考步骤401,本实施例在此不做赘述。

步骤1002,响应于元素添加指令,获取各个排序维度的初始数据。

当服务器接收到数据添加指令时,指示需要向数据库中加入新的元素,并进行排序,服务器基于元素添加指令,获取需要添加元素的各个排序维度的初始数据,即各个排序维度值。

示意性的,在直播过程中,当一个新的观众帐号初次向主播打赏虚拟礼物时,服务器需要向数据库中加入该帐号及对应的礼物数量,并基于帐号信息确定帐号等级和对应的时间戳信息等,对相应得分进行排序,便于生成送礼排行榜。

步骤1003,基于初始数据,向各个排序维度对应的比特位中写入初始排序维度值。

服务器获取到初始数据后,基于各个初始数据对应的排序维度,确定各个排序维度值在二进制数表示的元素分数中的比特位,并将初始排序维度值转换为对应二进制数,并写入对应的比特位中。

由于元素可能包含有多个排序维度,且不同排序维度的排序方式可能并不相同,如分数和等级往往采用正序排序,而时间戳则采用倒序排序的方式,因此在写入数据库前,需要将对应初始数据转换为对应的初始排序维度值,然后才能写入元素分数对应的比特位。因此,如图11所示,步骤1003还包括如下步骤。

步骤1003A,响应于初始数据对应的排序维度为正序排序,将二进制处理后的初始数据确定为初始排序维度值。

当确定出对应初始数据的排序维度为正序时,直接将初始数据转换为二进制数,并确定为初始排序维度值,且转换二进制数的比特位个数与score中设置的排序维度的比特位相对应。

如分数维度和等级维度,将初始数据的分数值转换为20个比特位的二进制数,等级值转换为4个比特位的二进制数,且各个排序维度按照优先级的顺序确定在元素分数中的位置,将各个初始排序维度值组成元素分数。

步骤1003B,响应于初始数据对应的排序维度为倒序排序,基于排序维度对应的最大二进制数以及二进制处理后的初始数据,计算初始排序维度值。

当确定出对应初始数据的排序维度为倒序时,对应数值越大的其排名应该越靠后,若直接将正序排序和倒序排序的初始数据组成元素分数,会导致排序错误,为了能够正确表示元素的排名情况,可以通过最大二进制数与初始元素分数进行作差,用计算后的差值进行表示,如初始数据是时间戳时,其数值越大,表示加入数据库的时间越晚,因此相减后对应的初始排序维度值也越小,此时,可以将确定的各个初始排序维度值组成元素分数。

需要说明的是,对于倒序排序的初始数据,除了设置最大二进制数以外,还可以通过设置固定的二进制数值并与初始数据相减来确定初始排序维度值,如某一排序维度的初始数据是4个比特位的0101,预设该排序维度固定的二进制数为1000,则计算的该排序维度值为0011。

步骤1004,将初始排序维度值写入排序维度对应的比特位中。

当数据库确定出各个初始排序维度值后,按照排序规则将初始排序维度值写入对应的比特位中。

在一个示例性的例子中,将初始数据写入数据库中的代码可以表示如下:

由上述代码可知,score包含有三个排序维度,在写入每个初始排序维度值时,按照从后往前的顺序依次读取各个比特位上的数据,并写入score中对应的比特位中,直至三个初始排序维度值全部写入score中,同时,对于新加入的元素,还需要将元素的标识信息写入与score关联的value中。

步骤1005,基于元素分数对数据库中的元素进行排序,其中,排序后的元素符合排序规则。

本步骤的实施方式可以参考步骤405,本实施例在此不做赘述。

步骤1006,响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

本步骤的实施方式可以参考步骤406,本实施例在此不做赘述。

本申请实施例中,当服务器接收到元素添加指令,需要向数据库中添加元素并进行排序时,通过获取各个排序维度的初始数据,并根据排序维度的排序方式对初始数据进行处理,确定出对应的初始排序维度值,进而将初始排序维度值写入排序维度对应的比特位中,获得元素的元素分数并存入数据库中进行排序,进一步的,当接收到排行榜生成请求时,基于排序后的元素生成排行榜,并进行反馈。

参考图12,其示出了本申请一个实施例提供的排行榜生成装置的结构框图。该装置包括:

读取模块1201,用于从数据库中读取各个元素各自对应的元素分数,所述元素分数由至少两个排序维度对应的排序维度值构成,且所述排序维度值在所述元素分数中的顺序基于所述排序维度在排序规则中的优先级确定;

排序模块1202,用于基于所述元素分数对所述数据库中的元素进行排序,其中,排序后的元素符合所述排序规则;

反馈模块1203,用于响应于排行榜生成请求,基于排序后的元素生成排行榜,并进行反馈。

可选的,所述元素分数为二进制数,第n排序维度在所述排序规则中的优先级高于第n+1排序维度在所述排序规则中的优先级;

可选的,所述第n排序维度对应的比特位高于所述第n+1排序维度对应的比特位,n为正整数。

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

第一获取模块,用于响应于分数更新请求,获取更新数据;

确定模块,用于确定所述更新数据对应的目标排序维度,以及所述目标排序维度对应的目标比特位;

更新模块,用于基于所述更新数据对所述目标比特位中的所述目标排序维度值进行更新。

可选的,所述更新模块,包括:

第一读取单元,用于从所述目标比特位中读取第一目标排序维度值;

计算单元,用于基于所述更新数据和所述第一目标排序维度值计算第二目标排序维度值;

第二读取单元,用于再次从所述目标比特位中读取第三目标排序维度值;

更新单元,用于响应于所述第三目标排序维度值与所述第一目标排序维度值相同,将所述第二目标排序维度值更新至所述目标比特位。

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

第二获取模块,用于响应于元素添加指令,获取各个排序维度的初始数据;

写入模块,用于基于所述初始数据,向各个排序维度对应的比特位中写入初始排序维度值。

可选的,所述写入模块,包括:

第一确定单元,用于响应于所述初始数据对应的排序维度为正序排序,将二进制处理后的所述初始数据确定为所述初始排序维度值;

第一写入单元,用于将所述初始排序维度值写入所述排序维度对应的比特位中;

第二确认单元,用于响应于所述初始数据对应的排序维度为倒序排序,基于所述排序维度对应的最大二进制数以及二进制处理后的所述初始数据,计算所述初始排序维度值;

第二写入单元,用于将所述初始排序维度值写入所述排序维度对应的比特位中。

可选的,所述反馈模块1203,包括:

第三确定单元,用于响应于排行榜生成请求,从排序后的元素中确定目标元素;

第三读取单元,用于从所述目标元素对应的目标元素分数中读取目标排序维度的目标排序维度值;

反馈单元,用于基于所述目标元素和所述目标排序维度值生成所述排行榜,并进行反馈。

可选的,所述反馈单元还用于:

响应于所述目标排序维度为正序排序,基于所述目标排序维度值确定所述目标排序维度的实际数据;基于所述目标元素和所述实际数据生成所述排行榜,并进行反馈;

响应于所述目标排序维度为倒序排序,基于所述目标排序维度值以及所述目标排序维度的最大排序维度值,计算所述目标排序维度的实际数据;基于所述目标元素和所述实际数据生成所述排行榜,并进行反馈。

在示例性的实施例中,还提供了一种服务器,所述直播服务器包括处理器和存储器,所述存储器中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以实现上述方面所述的排行榜生成方法。

在示例性的实施例中,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一段程序,所述至少一段程序由所述处理器加载并执行以如上述实施例中提供的直播互动方法。

在示例性的实施例中,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面提供的排行榜生成方法。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号