【问题标题】:How to efficiently store incrementing value with only LAMP?如何仅使用 LAMP 有效地存储递增值?
【发布时间】:2017-03-21 19:03:46
【问题描述】:

我有一个统计部分,它显示了一个计数器,它的值每秒随机增加 1000-10000,随机数会随着数字变大而增加,因此将来可能是 10000-100 万。

如果出现问题并且服务器关闭,我如何存储它以便我可以将该值检索回上次停止的位置?

最简单的方法是将其存储在 MySQL 中并每秒更新一次,但这会占用大量资源,我不认为它是为此而设计的。

我知道 Redis 可以做到,但我处于无法负担另一个数据库的情况。只有 1 个数字会不断增加,最有效的方法是什么?

【问题讨论】:

  • 保存数据库中随机数的最大限制?您可以通过仅每 10 秒发送一次查询来节省资源。
  • 在数据库中每秒保存一个值对服务器来说甚至不是微不足道的负载。
  • @arkascha 我想有效地做到这一点,因为我的数据库中还有其他活动模式并且不想影响它们。
  • 如前所述:每秒插入一次是没有负载可言的。您在这里没有效率问题。
  • @arkascha 我明白了。只是想找出最有效的方法

标签: php mysql database lamp


【解决方案1】:

你可以使用这个场景:

创建一个InnoDB 表和一个内存表。您将在Memory 表中保留一个条目,其中包含以下列:id、counter。 每次您必须增加计数器时,请执行以下操作:

  • 更新内存表中的计数器
  • 在 InnoDB 表中添加新条目

如果发生故障,您将通过计算InnoDB 表来初始化Memory 表计数器(因为Memory 表在服务器故障/重启的情况下会丢失其数据)。

为什么使用 InnoDB 记录日志?因为它有行锁并且插入新数据不会锁定整个表(就像 MyIsam 那样)。

为什么使用内存表作为计数器,而不是 InnoDB?如果更新一行的查询并发性过多,您可能会因为行锁而遇到问题和性能问题。

您也可以使用Memcache 代替Memory 表。这种方法将避免使用mysql作为计数器,但也存在数据丢失的相同问题(因此数据必须在失败的情况下进行初始化)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2021-09-07
    • 2015-08-10
    • 1970-01-01
    • 2016-03-15
    • 2018-01-02
    相关资源
    最近更新 更多