严格排行榜Redis实现

1 常见排行榜

排行榜主要分为两种,一种是并列排行榜(存在相同排名的情况),一种是严格排行榜(分先后顺序,不存在并列名次)。

一般根据不同的业务场景,选用不同的排行榜。例如,对于存在实物奖励且前一名与后一名的奖品差距很大时,往往采用严格排行榜,而对于只是激励用户的场景,则选用并列排行榜。

2 Redis严格排行榜实现

(1)数据结构:利用Redis的有序数列集合(zset)实现。
(2)实现原理:
有序集合由三部分组成,KEY(键)、score(成员的得分)、member(成员)。有序集合的每一项,都是以键值对的形式存储,每一项都有一个分数。有序集合会根据score自动排序。利用这个特性,我们就可以实现排行榜了。

score 是数字类型,可以是整形也可以是浮点型。按照排行榜多级排序的要求,相同分值下按照先来后到的顺序排序(创建时间越早,排序越高),但是Redis相同分值,是按照 member 的 ASCII码进行排序。

所以,需要将 score进行改造,同时记录得分与时间信息。实现方式有两种:
方式一,score 为整数,采用“得分 + 时间差”格式,比如:10 + (1534694400 - 1534649521) = 44889
方式二,score 为浮点数,采用“整数部分使用得分,小数部分使用时间差(截止时间减去创建时间)”格式。比如:10.44879

一般建议用第二种方式,因为,当需求不仅需要排序,还需展示得分时,可以将 score 强制转化成整形,即可获取到得分。需要注意的是,得分最好不要太大, score得分尽量控制在16位以下(浮点数时,小数点前后位数和不要超过16位,最好15位)。超过16位后,score值存入redis,会发生精度丢失。

你可能感兴趣的:(严格排行榜Redis实现)