php wherehas用法 创建10分钟后最有效的方法来使记录失效




laravel预加载 (2)

最有效的方法是使用视图。 咦? 这与这个问题有什么关系? 那么,不要在病房后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作业执行失败,数据不会“损坏” - 也就是说,你不会得到太旧的数据。
  • 如果系统忙(大量的插入),那么插入不会与删除竞争,进一步减慢系统。

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

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

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

这是我的代码:

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

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

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







cron