2015-04-05 63 views
0

我有一個密碼恢復系統,允許用戶通過電子郵件恢復其密碼。每個請求的詳細信息都會插入到我的recoveries表中,並在成功恢復時刪除。每次恢復創建10分鐘後,每個恢復都有一個時間戳。創建10分鐘後過期記錄的最有效方法

我想實現一個系統,它會在10分鐘後自動刪除每個過期恢復。由於這個到期時間對於每一行都是不同的,這意味着使用cron作業在執行這個任務時會非常無效。

什麼是最有效的方法來實現這一目標?

這裏是我的代碼:

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

從這裏拿參考http://stackoverflow.com/questions/14096429/how-to-delete-a-mysql-record-after-a-certain-time – Saty 2015-04-05 12:57:06

+0

我會親自離開記錄在並使用恢復的密碼向登錄名添加條件以匹配您的10分鐘延遲。然後在夜間每天添加一個cron任務清理過期的條目。 – 2015-04-05 13:01:43

+0

@satishrajak什麼時候我應該運行該代碼? – mightyspaj3 2015-04-05 13:08:33

回答

0

你可以在MySQL的水平寫一個觸發功能,當一個條目將被插入/更新,它會觸發功能,也將刪除所有條目(或條目舊的然後10分鐘)爲這個特定的用戶。 這樣你不必每隔1分鐘檢查一次(cron job)就可以看到從數據庫中刪除的條目(會讓你的生活變得輕鬆並且會節省一些資源。)

你也可以實現這種技術當任何人登錄時(如果你不想在觸發器級別使用觸發器)

+0

但是最後一個條目怎​​麼樣,刪除它必須等到下一個條目到達 – 2017-11-13 11:11:40

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作業執行失敗,數據不會「損壞」 - 也就是說,您不會收到太舊的數據。
  • 如果系統繁忙(大量插入),則插入不會與刪除競爭,從而進一步降低系統速度。
+1

這個問題的最佳解決方案。 – 2017-11-13 12:17:38