背景图

最近24小时热点问题

概述

前段时间我们在处理论坛帖子的问题,这时候产品提出来一个需求就是他想做热们帖子的功能,这些帖子要求是1小时内活跃度的排名,意思是还有日活跃度、周活跃度和月活跃度,还有天活跃度,天以上的我们可以通过定时器进行统计计算。活跃度是点击、点赞、查看量算出来的综合排名,这样我们还要进行常规的计算等等。

他还要一小时,3小时的活跃度啥的,具体的忘记了。哦,想起来了,他想要最近24小时的活跃度。然后每小时更新一次这样的需求。

初始方法

想想这个最近24小时活跃度,正常大家都是认为是前24小时,卧槽这不是要死人吗,每次用户请求我们都要查询一遍,这样可不行的。后来才明白是上24小时区间的活跃度,这才是正常点的思路。

不过想想一小时统计一次数据,这样可能真的不行,于是我在想如何进行不统计的排名呢?重点是统计之后还要计算,然后排序。后来想来想去,就是建立一个队列。但是想想不对当前的点击量等数据应该是要存放的。而且放入redis中,你还要找到所有的值进行计算然后再排名。这样也不是很好的做法。

大家都知道redis里面有有序表,哎,让他帮我们维护吧,我们自己来维护问题实在是太多了。

统计的方法时行不通的,只能缓存。

后来的想法

接着我的想法是维持一个一天的数据,然后在24点的时候清零一下数据。重新开始计算,本来觉得这个想法挺好的,不过后来一想不对,时间的维度为啥一天一定是0-24点,1-25点不行?

然后思维扩展起来了。

最终方案

最后的方案就是特别赞,我当时就觉得哇,这么棘手的问题都解决了。

方案就是维持24个队列,这24个队列分别对应于0-24,1-25,2-26….23-47。

然后每发生一个时间就向这24个队列写数据,每个都写。然后根据系统当前时间决定使用哪个区间的数据。一个区间的数据一旦使用过就清零,然后重新接受数据,24小时后,这个区间就有了前24个小时的数据,这样我们的最近一小时活跃度的问题就解决了。

但是注意当前区间这一小时的值怎么办?好办暂存,用完之后那个区间替换当前区间,当前的区间再作为一个临时区间处理,这样利用25个队列,这个问题圆满解决。

这个有点像地理里面的新一天旧一天的感觉,这就是我们最终的方案,解决这个问题之后,心情特好。

0%