【问题标题】:Filtering popular items by using day / week / month使用日/周/月过滤热门商品
【发布时间】:2010-12-13 23:13:02
【问题描述】:

我正在开发一个有 200.000 页的网站。还有一个浏览部分,显示最受欢迎、评分最高等文件。然而,这部分将在几周后,在发布后变得几乎静止。所以我还想实现一个过滤系统,它将显示今天、本周、本月最受欢迎的项目,就像 youtube 一样。

就像这样:

http://www.youtube.com/videos?c=2

我应该如何实现这个功能?我是否需要另一个表格,每天每个文档都有一个新条目?

docid、日期、view_count、评分

那么我将获得今天的行以使用一天进行过滤,还是计算一周(7行)以使用周进行过滤?似乎效率不高。你有什么建议吗?

顺便说一下,我正在使用 LAMP 堆栈。

谢谢,

【问题讨论】:

  • 请记住安全问题,例如,如果您不希望单个用户能够每秒生成 1000 个视图。祝你好运实现一种方法来阻止一个坚定的攻击者..

标签: php mysql filtering


【解决方案1】:

假设您为表中的记录添加时间戳,您应该能够放置一个 where 子句,将时间戳限制在您想要的任何时间范围内。

您可以将结果(尤其是较长的结果)缓存足够长的时间以使请求变得无关紧要。

编辑

但也许您的意思是今天最受欢迎,而不是今天添加的最受欢迎?

在这种情况下,我没有答案。

【讨论】:

    【解决方案2】:

    最直接的做法是每次资源显示在recent_views(what, when)时保存时间戳和资源id。可以使用适当的 WHERE 子句(如 WHERE when > $beginOfPeriod AND when < $endOfPeriod)创建每日/每周/每月图表。

    出于性能原因,您可以每晚汇总值,将总和保存在单独的表中,例如 daily_views(what, sum),并截断源表。

    【讨论】:

      【解决方案3】:

      我想我会在代码中计算日期,然后将它们作为参数传递给您正在使用的 SQL。

      【讨论】:

        【解决方案4】:

        我会使用编译器来完成。考虑到流量和响应时间,Youtube 可能也会这样做。

        原理很容易理解。您在page_view 表中记录每个视图或评分。您定义编译发生的时间段(每小时、每天、每周、每月)。每次您遇到好时机(例如:一天结束)时,您都会执行编译器,它实质上是执行查询...

        SELECT * FROM page_view WHERE date > $from_date AND date < $to_date
        

        ... 并存储结果。这可能在 cron 作业中效果更好。

        下次需要显示信息时,直接取出存储的结果显示即可,无需重新计算。您可以使用多种存储方法:MySQL 表(例如:page_view_compiled)、memcached 等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          相关资源
          最近更新 更多