redis zset实现排行榜

| 分类 技术  | 标签 业务开发 

排行榜介绍

在业务开发过程中会遇到很多排行榜类似的需求,比如粉丝排行榜,播放排行榜等,排行榜本身含义非常清晰,就是维护一个列表,其中每个条目有一个score,依据score进行排序,形成排行榜

redis zset

redis zset由于如下特性天生支持排行榜需求:

  • zset是有序集合类型
  • zset支持常用的添加,删除,范围读取操作
  • 有序集合的成员是唯一的,但分数(score)却可以重复

下文将详细展开介绍:利用redis zset实现排行榜功能

redis zset实现排行榜功能

现在假定有如下排行榜需求:实现一个粉丝Top10排行榜。简单分析该需求,我们可以将用户id作为member,用户粉丝量作为score,并设置redis keyfans_rank形成redis zset

按照如下步骤你可以很容易地实现该功能:

如果用户粉丝数目发生变动,则需要将该用户重新添加到zset中进行排序,假定用户id为user_id,粉丝量为score,则命令如下:

ZADD fans_rank user_id score

注意算法复杂度:

Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set.

由于要维持TopN排行榜,所以最好的处理方法是每次ZADD后执行ZREMRANGEBYRANK,假定要维护TopN榜单,则命令如下:

ZREMRANGEBYRANK fans_rank 0 -(TopN+1)

注意:

  • 这里范围是0——-(TopN+1),因为redis zset是按照从小到大方式排序的,所以需要维持的榜单是倒数TopN,也即从最后一个元素开始,倒数推TopN个
  • 时间复杂度:

    Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements removed by the operation.

  • 3.zset删除member

如果某个用户进行注销操作,或者被封号了,这个时候该用户应该从redis zset中被踢掉,如下:

ZREM fans_rank user_id

注意算法复杂度:

Time complexity: O(M*log(N)) with N being the number of elements in the sorted set and M the number of elements to be removed.

最后是获取排行榜TopN数据,命令如下:

ZREVRANGE fans_rank 0 (TopN-1) withscores

注意:

  • 这里范围是0——TopN-1,原因是:redis zset下标从0开始,而ZREVRANGE是倒序取数据
  • redis zset ZRANGEZREVRANGE当元素score相同时会默认根据member字典序排序
  • withscores会将member与对应score一起返回
  • 算法复杂度:

    Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements returned.

通过如上四个步骤就可以顺利完成排行榜核心逻辑开发

其他

这里给出redis zset与排行榜功能相关的其它几个常用命令:

Refs


上一篇     下一篇