Redis实现日、周排行榜

排行榜在很多场景都有使用,下图就是一个简单的排行榜。

排行榜.png

图片来自于云汉芯城

那么你知道怎样去实现这样的一个排行榜么?

用Redis的有序集合zset就可以轻松做到,下面我们就来一步步实现。

读前须知

此文会用到redis的三条命令,分别是zincrby zrevrange zunionstore,还不熟悉的小伙伴需要先去查询文档哦。

日排行

想要实现关键词的搜索排行,首先我们肯定时要把每个关键词和他搜索的次数导入zset中。我们给这个集合起个名字 select:20200320,然后每次搜索一次关键词我们就把select:20200320中这个关键词的分数+1,

zincrby select:20200320 1 iphone
zincrby select:20200320 1 oppo
zincrby select:20200320 1 xiaomi
zincrby select:20200320 1 xiaomi
zincrby select:20200320 1 iphone
zincrby select:20200320 1 iphone

以上命令就模拟了,用户搜索3次iphone,2次小米,1次oppo的场景,
我们可以用下面这个命令输出搜索次数前三的关键词及其搜索次数

zrevrange select:20200320 0 2 withscores

命令说明:
把 select:20200320这个集合按照分数高低从大到小排序,并输出前三个元素以及它的分数

结果如下:


revrange.png

这样一个日排行榜就完成了,有没有很简单?

周排行

我们先来思考下什么是周排行,顾名思义,周排行也就是一周内所有关键词的累计搜索次数的排行。所以首先我们需要有每日的排行数据,通过计算才能得出周排行。听上去挺麻烦对不对?其实不然,我们一条命令就可以搞定周排行,来,开干!

因为一个完整的周排行需要7天的数据,比较多,为了演示方便,我们只统计近两日排行,不过大家放心,两日排行和周排行原理是一模一样的,甚至命令也是一模一样的。

既然几天的关键词的集合名是select:20200320,那么昨天的肯定是select:20200319,我们先添加几条数据

zincrby select:20200319 1 oppo
zincrby select:20200319 1 xiaomi
zincrby select:20200319 1 xiaomi
zincrby select:20200319 1 iphone
zincrby select:20200319 1 iphone
zincrby select:20200319 1 chuizi

以上命令就模拟了,用户搜索1次oppo,2次iphone,2次小米,1次chuizi的场景

下面关键就来了,我们如何用一条命令就计算出最近两日的排行呢,很简单,我们用zunionstore这个命令实现

zunionstore select:last_2 2 select:20200320 select:20200319

命令说明:
把 select:20200320 select:20200319 这两个集合里的元素与分数合并至select:last_2这个集合中

zunion.png

可以看到我们很轻松的就把最近两日的搜索数据合并入select:last_2这个有序集合中了,同理,你可以把最近一周的数据用上面的命令合并到select:last_7这个集合中,我这里就不过多演示了,你们回头自己研究。

最后

通过上面的介绍,相信你已经知道如何如果通过redis去实现简单的排行榜了,如果对你有用,请点赞,点赞,点赞~

你可能感兴趣的:(Redis实现日、周排行榜)