4 回答

TA貢獻1796條經驗 獲得超10個贊
設置一個有效期長量,如 120 秒
用戶申請短信驗證碼
服務端根據用戶的手機號創建記錄:創建時間、手機號、驗證碼、激活狀態(默認為否)
提交第 3 方短信平臺(如果有必要等結果再對條目的狀態做標記,那就另說)
用戶提交驗證,服務端讀取『手機號+驗證碼』及創建時間倒序的第 1 條,,
過期,直接駁回
沒過期,繼續下面的業務,將數據庫里條目狀態標記為已激活
如不存在,直接駁回(可能被刪了,也可能是手機號碼、驗證碼之一不正確)
如已存在,檢查過期時間(用戶提交時間-條目創建時間是否小于等于 120 秒)
與此同時,跑一個定時腳本,每隔 10 分鐘啊 20 分鐘去刪數據:
已驗證的。
距離腳本操作時間大于 120 秒或更長時間的;
希望有用。

TA貢獻1851條經驗 獲得超4個贊
Redis清除過期緩存就兩種辦法:
根據key獲取value時判斷是否過期
通過一個過期隊列(根據過期時間排序)來清除過期數據
所以對于驗證碼這種也可以考慮這么做:
方案一: 在輸入驗證碼之后,判斷驗證碼是否正確的時候,如果驗證碼正確,判斷一下驗證碼是否過期。
方案二: 將手機號碼,驗證碼存儲到一個Map中,同時將手機號碼,過期時間存儲到DelayQueue中。另起一個線程,不斷地從DelayQueue中獲取元素,將獲取到的元素從Map刪除。
這兩個方案可以同時都用,或者只用其一。
DelayQueue: 延時隊列,Blocking隊列,內部實現是用一個Priority隊列,以延遲時間作為比較的依據。只有達到延遲時間之后元素才可以被獲得,可用于清除空閑連接,過期緩存,超時任務等(例如緩存,將緩存對象放到DelayQueue中,delay時間等于緩存過期時間,運行一個deamon線程從DelayQueue中獲取元素,然后將其清除)。
添加回答
舉報