我正在开发一个包含很多项目的高吞吐量网站,我正在考虑实施“现在趋势”类型的功能,这将允许用户快速获得最近查看过的最多N个项目的优先级列表人们逐渐消失,因为他们的观点越来越少。
关于如何做到这一点的一个想法是给予项目的近期视图更多的权重,例如过去15分钟的项目的每个视图的权重为16,对于项目的每个视图的权重为8过去1小时,过去4小时内的重量为4,等等,但我不知道这是否是接近它的正确方法。
我想在Redis中做到这一点,我们过去在Redis上取得了很好的成功。
在技术上和确定趋势是什么时,最好的方法是什么?
第一个答案提示解决方案,但我正在寻找更多细节 - 开始赏金。
这些都是不错的想法,但还不够详细。一个得到了一半的赏金,但问题仍未解决。
答案 0 :(得分:6)
因此,我将从基本时间排序开始(例如,按时间戳评分的item_id的zset),然后根据交互进行浮动。因此,您可能会认为单次互动的价值为10分钟“新鲜度”,因此每次互动都会为相关项目的得分增加很多时间。如果所有交互都被平等估值,您可以使用一个zset执行此操作,并在交互发生时增加分数。
如果您希望通过交互计数的平方根而不是直接交互计数进行某种退避,您可以使用您的交互分数构建第二个zset,并使用zunionstore进行组合这与您的时间戳索引。为此,您可能想要取出现有分数,对其进行一些数学计算并对其进行新分数(zadd将允许您覆盖分数)
zunionstore可能很昂贵,而且对于足够大的套装,甚至zadd / zincrby也会变得昂贵。为此,您可能希望仅保留N个最高得分项,N = 10,000,具体取决于您的应用需求。
答案 1 :(得分:4)
答案 2 :(得分:3)
Reddit排名算法可以很好地完成您所描述的内容。这里有一篇很好的文章,讲述它是如何运作的。
https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9
答案 3 :(得分:2)
考虑一个有序集,其中视图数作为分数。无论何时访问某个项目,都要增加其分数(http://redis.io/commands/zincrby)。通过这种方式,您可以获得按分数排序的最佳项目。
你也需要“淡化”这些项目,也许还有一个可以减少分数的外部过程。