从创建起10分钟后使记录失效的最有效方法

时间:2015-04-05 12:53:26

标签: php mysql cron

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

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

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

这是我的代码:

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

2 个答案:

答案 0 :(得分:4)

最有效的方法是使用视图。咦?这与问题有什么关系?好吧,不要在病房后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作业无法执行,则数据不会被损坏&#34; - 也就是说,你没有得到太旧的数据。
  • 如果系统繁忙(大量插入),则插入不会与删除竞争,从而进一步降低系统速度。

答案 1 :(得分:0)

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

当任何人登录时(如果你不想在mysql级别使用触发器),你也可以实现这种技术。