【问题标题】:How to cache queries at a time interval and send them all together when the time expired?如何按时间间隔缓存查询并在时间到期时将它们全部发送?
【发布时间】:2014-07-16 23:17:03
【问题描述】:

我确信有很多此类主题的教程,但我找不到我想要的,因为我不知道它的行话。所以我问 StackOverflow。

这里是例子:
人们可以喜欢或不喜欢 Youtube 上的视频,并且数据库应该更新喜欢或不喜欢的计数。然而,每次用户点击喜欢/不喜欢按钮时更新数据库是不切实际的,尤其是对于像 Youtube 这样的网站。

我们如何在一个时间间隔内缓存查询/计数数字,并且当时间到期时我们一次发送所有查询/更新数据库?或者针对这种情况的任何类似技术?

【问题讨论】:

  • 更新数据库有什么不切实际的?这就是数据库的用途。 - 或者,您可以将like/disklike 按钮链接到 GET 或 POST 请求,并定期扫描服务器日志文件。但我怀疑这在运行时或编程工作方面会更有效。
  • 我只是在想我们可以在更新记录之前缓存 300 或更多的喜欢/不喜欢。因为这似乎是 reddit 和其他网站正在做的事情。
  • 你将创造比解决更多的问题。如果缺乏性能,只需尝试简单的数据库方法并添加一些硬件。此外,其他网站可能会缓存其网站页面并定期重新构建它们,但不一定是相关的数据库条目。
  • 请务必使用允许行级锁定的数据库架构(例如 innoDB)进行此类写入密集型操作。

标签: mysql sql database caching


【解决方案1】:

因此,您观察到的是某件事发生与能够查看发生的结果之间的时间延迟。

而且您正走在只定期更新的正确道路上。

但就定期更新的位置而言,您走错了路。

问题是您想要每次尽快更新“数据库”(即负责编写的数据库 - 选择 CAP 的缺失角落三角形)以非常快速地捕获所有内容,但是对于您的访问者/查看者,您可以让他们稍微落后(几秒钟到可能一天,具体取决于情况)写入数据库的视图。

您不希望将其存储在浏览器上,并且可能会在请求失败、互联网中断等情况下丢失用户所做的操作。

稍微偏离主题 - 如果没有关于通过缓存、缓冲等方式知道要节省多少数据的数据,您通常不会尝试“过早优化”。像这样的优化会增加复杂性 - 您会保持清醒,更长时间,如果您尽可能长时间地保持简单。一旦您知道瓶颈是什么,就可以让您的设计保持简单并优化您的瓶颈。

稍微偏离主题 - 我建议阅读分布式计算,特别是因为它与数据库有关,然后是一些设计。你会发现这些高度集中的抽象问题都有“解决方案”,各有利弊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2018-03-22
    • 2023-02-21
    • 1970-01-01
    • 2021-03-02
    • 2019-05-26
    相关资源
    最近更新 更多