排行榜介绍
在业务开发过程中会遇到很多排行榜类似的需求,比如粉丝排行榜,播放排行榜等,排行榜本身含义非常清晰,就是维护一个列表,其中每个条目有一个score,依据score进行排序,形成排行榜
redis zset
redis zset由于如下特性天生支持排行榜需求:
- zset是有序集合类型
- zset支持常用的添加,删除,范围读取操作
- 有序集合的成员是唯一的,但分数(score)却可以重复
下文将详细展开介绍:利用redis zset
实现排行榜功能
redis zset实现排行榜功能
现在假定有如下排行榜需求:实现一个粉丝Top10排行榜。简单分析该需求,我们可以将用户id作为member,用户粉丝量作为score,并设置redis key
为fans_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.
- 4、zset范围读取
最后是获取排行榜TopN数据,命令如下:
ZREVRANGE fans_rank 0 (TopN-1) withscores
注意:
- 这里范围是
0
——TopN-1
,原因是:redis zset
下标从0开始,而ZREVRANGE
是倒序取数据 redis zset
ZRANGE
与ZREVRANGE
当元素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
与排行榜功能相关的其它几个常用命令: