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

zscore sport:ranking:why:20210227 jay

66079,步数也有了。

现在我们知道了:why 的好友 jay 今日运动步数 66079 步,在 why 的微信好友中排第一名。

但是你仔细看,这上面我还漏了两个字段:

微信头像

朋友点赞个数

两个字段应该怎么放呢?

放数据库里面当然可以,但是我们主要还是说一下 Redis 的解决方案。

这个时候其实我们想要存储的是 User 对象,对象里面有这几个字段:昵称、头像图片链接、点赞数、步数。

你说,这个用 Redis 的啥数据结构来存?

可不就得用 Hash 结构了吗。

Hash 结构同样涉及到 key 和 value,那么它们分别是什么呢?

key 就是我们的有序集合的 key 后面再加上好友昵称,比如这样的:

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

对应的命令是这样的:

hmset sport:ranking:why:20210227:jay nickName jay headPhoto xxx likeNum 520 walkNum 66079

执行完成之后,在 RDM 里面看起来是这样的:

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

当后续有更多的赞的时候,需要调用更新命令更新 likeNum:

hincrby sport:ranking:why:20210227:jay likeNum 500

执行完成之后点赞数就会变成 1020:

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

这样,排行榜上的所有字段我们都能获取到了,微信排行榜就说完了。

呃......

怎么感觉还是 API 教学呢?

不得劲,换个其他的。

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

最近七天排行榜怎么弄?

前面我们说的都是每日排行榜。

假设面试官要求我们提供一个最近七天、上一周、上一月、上个季度、这一年排行榜啥的,又该怎么搞呢?

其实这还是在考察你对于 Redis 有序集合 API 的掌握程度。

也就是这个 API:

zinterstore/zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max] 获取交集/并集

这个 API 看起来有点复杂,不要怕,一个个的讲:

zinterstore/zunionstore其实就是交集/并集

destination 将交集/并集的结果保存到这个键中

numkeys 需要做交集/并集的集合的个数

key [key ...] 具体参与交集/并集的集合

weights weight [weight ...] 每个参与计算的集合的权重。在做交集/并集计算时,每个集合中的 member 会把自己的 score 乘以这个权重,默认为 1。

aggregate sum|min|max 对于各个集合中的相同元素是 sum(求和)、min(取最小值)还是max(取最大值),默认为 sum。

拿最近七天举例,我们随便搞点数据进来,你可以直接粘过去玩:

zadd sport:ranking:why:20210222 43243 why 2341 mx 8764 les 42321 skr

zadd sport:ranking:why:20210223 57632 why 24354 mx 4231 les 43512 skr 5341 jay

zadd sport:ranking:why:20210224 10026 why 12344 mx 54312 les 34531 skr 43512 jay

zadd sport:ranking:why:20210225 54312 why 32451 mx 23412 les 21341 skr 56321 jay

zadd sport:ranking:why:20210226 3212 why 63421 mx 53652 les 45621 skr 5723 jay

zadd sport:ranking:why:20210227 5462 why 10158 mx 30169 les 48858 skr 66079 jay

zadd sport:ranking:why:20210228 43553 why 4451 mx 7431 les 9563 skr 8232 jay

可以看到我们一共有 7 天的数据:

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

而且需要注意的是 20210222 这一天是没有 jay 的数据的。

现在我们要求出最近 7 天的排行榜,就用下面这行命令,命令有点复杂,但是对着命令格式看,还是很清晰的:

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

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