凉了呀,面试官叫我设计一个排行榜。 (3)

获取 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssyj.html