5

我正在一个包含许多项目的高吞吐量站点上工作,正在研究实现“现在趋势”类型的功能,这将允许用户快速获得最近被许多人查看的前 N ​​个项目的优先列表,即随着观看次数的减少,它们会逐渐消失。

关于如何做到这一点的一个想法是为项目的最近视图赋予更多权重,例如过去 15 分钟内对项目的每次视图的权重为 16,对于过去 1 中项目的每次视图的权重为 8小时,过去 4 小时内事物的权重为 4 等,但我不知道这是否是处理它的正确方法。

我想在 Redis 中执行此操作,过去我们在其他项目中使用 Redis 取得了很好的成功。

在技​​术上和确定趋势方面,最好的方法是什么?

第一个答案暗示了一个解决方案,但我正在寻找更多细节——开始赏金。

这些都是不错的想法,但不够详细。一个人得到了一半的赏金,但问题悬而未决。

4

4 回答 4

8

所以,我会从一个基本的时间排序开始(例如,按时间戳计分的 item_id 的 zset),然后根据交互来浮动。因此,您可能会认为单次互动值得 10 分钟的“新鲜感”,因此每次互动都会为相关项目的分数增加那么多时间。如果所有交互的价值均等,您可以使用一个 zset 执行此操作,并在交互发生时增加分数。

如果您想要某种回退,例如,通过交互计数的平方根而不是直接交互计数来评分,您可以使用您的交互分数构建第二个 zset,并使用 zunionstore 将其与您的时间戳索引。为此,您可能需要提取现有分数,对其进行一些数学运算并在其上添加一个新分数(zadd 将让您覆盖分数)

zunionstore 可能很昂贵,对于足够大的集合,即使 zadd/zincrby 也会变得昂贵。为此,您可能只想保留 N 个得分最高的项目,例如 N=10,000,具体取决于您的应用程序需求。

于 2013-07-03T18:20:44.663 回答
4

这两个链接非常有用:

http://stdout.heyzap.com/2013/04/08/surfacing-interesting-content/

http://word.bitly.com/post/41284219720/forget-table

于 2013-09-05T21:42:37.333 回答
3

Reddit 排名算法在您描述的方面做得很好。这里有一篇很好的文章,讲述了它是如何工作的。

https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9

于 2014-06-04T17:33:50.740 回答
2

考虑一个以视图数作为分数的有序集。每当访问一个项目时,增加它的分数(http://redis.io/commands/zincrby)。通过这种方式,您可以从按分数排序的集合中获取顶级项目。

您也需要“淡化”这些项目,也许使用会降低分数的外部过程。

于 2013-06-11T05:31:51.077 回答