获取 member 排名:zrevrank key member
首先,排名都是 0 开始计算的。
zrank 是按照分数从低到高返回 member 排名。
zrevrank 是按照分数从高到低返回 member 排名。
比如现在要获取 jay 的排名,用 zrank 返回结果就是 4。
zrank sport:ranking:20210227 jay
当用 zrevrank 时,jay 的排名就是 0:
zrevrank sport:ranking:20210227 jay
所以,在微信步数排行榜的这个需求中,步数越多排名越靠前,我们应该用 zrevrank。
第四个需要掌握的命令是:返回指定排名范围内的 member。
zrange/zrevrange key start end [withscores] 返回指定排名范围内的 member
这个命令就很关键了。
zrange 是按照 score 从低到高返回指定排名范围内的 member。
zrevrange 是按照 score 从高到低返回指定排名范围内的 member。
在这里,我只演示 zrevrange 的命令。
比如我要获取步数排名前三的 member:
zrevrange sport:ranking:20210227 0 2
这个命令有个可选参数:withscores
当带上这个参数之后,会返回对应 member 的 score:
你想,这不就是排行榜 top N 的场景吗?
假设我现在要获取所有用户的排名,怎么写呢?
如下:
zrevrange sport:ranking:20210227 0 -1
这就是当前的微信步数排行榜,jay 步数最多,mx 步数最少。
咦,怎么回事,排行榜好久就出来了呢?
你想想,讲完几个 API 操作,好像功能就实现了呢?
是的,确实是这样的,甚至我们只需要这两个 API 就能完成排行榜的需求:
zadd key score member [score member ...] 添加 member
zrange/zrevrange key start end [withscores] 返回指定排名范围内的 member
好了,如果大家喜欢的话,感谢大家一键三连。本次的文章就到这里了...
那是不可能的。
索然无味的 API 文章多没有意思啊。
虽然前面的部分我们已经可以基于 Redis 的有序集合加上几个简单的命令,就可以实现排行榜需求了。
但是前面只是铺垫,接下来,好戏才刚刚开始。
再次审视排行榜上面的微信步数排行榜有个问题,你发现了吗?
就上面这个场景而言,所有人来看,看到的都是这样的排序:
而真实情况是,每个人看见的数据排行数据来源自己的微信好友,而微信好友各不相同,所以看到的排行榜也各不相同。
这个特性,我们并没有体现出来。
我们上面的场景更加类似于游戏排行榜,所有的人看到的全服排行榜都是一样的。
那么怎么保证我们每个人看到的各不相同呢?
你思考一下,该从什么角度去解决这个问题呢?
有序集合的 key 不同,就获取到不同的 value 集合。
我们当前的 key 是 sport:ranking:20210227,里面只包含了某一天的信息。
只要我们在 key 里面加上用户的属性就可以了,假设我的微信号是 why。
那么 key 可以设计为这样 sport:ranking:why:20210227。
这样,由于 key 里面多了用户信息,每个人的 key 都各不相同,就像这样的:
对应的命令如下:
zadd sport:ranking:why:20210227 10026 why 10158 mx 30169 les 48858 skr 66079 jay