【问题标题】:update specific column of a row in mysql after every 5 minutes unsing node.js使用node.js每5分钟更新一次mysql中一行的特定列
【发布时间】:2016-02-17 22:13:48
【问题描述】:

我正在使用 node.js(非 express)服务器和 mysql 数据库进行项目。当用户单击页面上的按钮时,它会上传 2 个值(例如 SpecificName、Yes/No)。现在这些值通过节点服务器插入到 mysql 数据库中。稍后,mysql 对 specificName 列进行检查(如果没有找到,则创建一个具有相同名称的列)并更新其中的第二个值。

现在我想将用户通过网站所做的第二个值的每次更新(即是)在 mysql 数据库中保留 5 分钟,之后它会自动用另一个值更新特定位置(比如取消)。除了这个 5 分钟悖论,我很幸运能解决所有问题。我还保留了 15-20 个所谓的 specificName 列,其中的值(比如是/否)正在更新,同时有超过 1000 行同时工作,因此有很多 5 分钟的计时器正在进行价值。有没有办法将值暂时存储在mysql中,然后自动销毁?

我遇到了:

  1. node-crons(太复杂了,不知道是不是一个正确的选择)
  2. mysql 事件(我不知道如何将它与节点一起使用)
  3. 时间戳(不能创建多个时间戳(我想我需要为每一列创建一个))
  4. datetime(还没有测试过)和其他的东西,比如 (从table 删除timestamp > DATE_SUB(现在(),间隔 5 分钟))。 现在我不知道该使用什么或如何解决这个难题。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql node.js


    【解决方案1】:

    根据我在 kik 上与 Sammy 的对话,我很确定你不想这样做。这听起来不像是适合 MySQL 的用例。我也担心你的 MySQL 知识非常有限,在这种情况下,你应该花时间对 MySQL 做更多的研究。如果没有更好地了解您的应用程序试图实现的更大目标,我无法提出更好的替代方案。如果您能在不影响产品理念的情况下想出一种方法来解释应用程序的行为,那将非常有助于帮助我们解决您的问题。

    在给您可能的答案之前,我想先说明的一般事项:

    • 您不应该更改应用程序中的列。这是我对 Node/Mongo 世界的问题之一。关系数据库不喜欢频繁更改表定义。这是度过痛苦的一天的捷径。在 Mongo 或 Cassandra 等非关系系统中这样做很好,但传统的关系数据库不喜欢这样。应用程序应该只插入、更新和删除行。你已经被警告了。
    • 我不确定您是否要将数据放入过期日期较短的 MySQL 中。您可能需要某种缓存解决方案,例如 memcacheredis。现在,您可以让 MySQL 表现得像一个缓存,但这不是它的预期用途。有更好的解决方案。如果您坚持为此使用 MySQL,我建议您调查MEMORY storage engine,以便在系统突然关闭时以丢失数据为代价更快地读取/写入。

    以下是一些潜在的解决方案:

    • MySQL Events - 有一个时间戳列和一个计划运行的事件......每分钟左右说一次。如果事件发现某行已存在超过 5 分钟,请将其删除。
    • NodeJS setTimeout - 从应用程序中,插入记录后,设置 5 分钟的超时时间以删除所述记录。您可能需要确保有某种 id 或时间戳列,以便快速引用这些值。

    这是我想到的两个最佳解决方案。同样,如果您愿意透露您的应用程序的行为需要这样一个不寻常的解决方案,我们可能会帮助您找到更好的解决方案。

    【讨论】:

    • Sammy 提出了在 Web 服务器上执行 setTimeout 5 分钟的性能问题。这是一个完全合理的担忧。你会想要测试。
    • 好的,感谢您对我保留 Sammy 的关注。你可以问他任何你觉得相关的问题。
    • 而不是使用超时功能暂停节点应用程序,我更喜欢使用节点 cron 来执行函数并在某些条件满足时停止 cron
    • 我在使用 crons 时没有任何问题,但是是否可以管理如此多的 mysql 行,其中数据在每个用户的大量列中仅提供 5 分钟。
    【解决方案2】:

    好吧,所以我猜我自己想通了。我正在为所有仍然处理这个查询的人发布这个答案。我在 mysql 中使用了我为 specificName 的每一列创建的 DATETIME 标记。所以对于每个 specificName 列,存在另一个 specificName_TIME 列,它存储值的时间(是/否)已更新。我没有使用时间戳的原因是因为它无法在低于 5.6 的 mysql 版本中创建时间戳的结束编号。现在我通过在将其存储到数据库之前添加 5 分钟来更新当前时间。然后我运行了 2 个链函数。第一个检查数据库中的日期时间是否小于当前时间(SELECT specificName FROM TABLE WHERE specificName_TIME

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多