【问题标题】:Most efficient method to expire records after 10 minutes from creation在创建 10 分钟后使记录过期的最有效方法
【发布时间】:2015-04-05 21:40:10
【问题描述】:

我有一个密码恢复系统,允许用户通过电子邮件恢复他们的密码。每个请求的详细信息都插入到我的recoveries 表中,并在成功恢复后被删除。我为每个恢复设置了一个时间戳,该时间戳设置在每个恢复创建后 10 分钟。

我想实现一个系统,它会在 10 分钟后自动删除每个过期的恢复。由于每一行的到期时间都不同,这意味着使用 cron 作业在执行此任务时效率极低。

实现这一目标的最有效方法是什么?

这是我的代码:

$time = time();
$recoveries = DB::fetch("DELETE FROM `recoveries` WHERE `expiry` <= ?;", array($time));

【问题讨论】:

  • 我会亲自将记录留在表中,并使用恢复的密码向登录添加条件,以匹配您的 10 分钟延迟。然后添加一个每天晚上打扫房间的cron任务,清理过时的条目。
  • @satishrajak 我什么时候应该运行该代码?
  • 你可以在你的mysql数据库中运行一次这段代码,它会在每10分钟内自动运行一次
  • 我只是在 Phpmyadmin 的 SQL 控制台中运行该代码吗?

标签: php mysql cron


【解决方案1】:

最有效的方法是使用视图。嗯?这与问题有什么关系?好吧,不要在病房后10分钟删除。相反,创建一个具有以下逻辑的视图:

create view v_recoveries as
    select r.*
    from recoveries r
    where expiry > date_sub(now(), interval 10 minutes);

为了提高性能,您需要在recoveries(expiry) 上建立索引,所以这应该很快。

然后,在您闲暇时——每天一次、每小时一次或每周一次——删除不需要的记录:

DELETE FROM `recoveries`
    WHERE `expiry` <= date_sub(now(), interval 10 minutes);

这种方法有几个优点:

  • 数据的存在时间正好是 10 分钟,而不是基于某些作业的调度。
  • 实际删除可以在系统静止时进行。
  • 如果 cron 作业无法执行,则数据不会“损坏”——也就是说,您不会获得太旧的数据。
  • 如果系统繁忙(大量插入),则插入不会与删除竞争,从而进一步降低系统速度。

【讨论】:

  • 这个问题的最佳解决方案。
【解决方案2】:

您可以在 mysql 级别编写一个触发函数,当一个条目将被插入/更新时,它将触发该函数,该函数将删除该特定用户的所有条目(或早于 10 分钟的条目)。 这样您就不必每 1 分钟检查一次(cron 作业)来查看要从数据库中删除的条目(这将使您的生活变得轻松并节省一些资源。)

您也可以在任何人登录时实现此技术(如果您不想在 mysql 级别使用触发器)

【讨论】:

  • 但是最后一个条目呢,要删除它必须等到下一个条目到达.....
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2022-12-16
相关资源
最近更新 更多