要實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能,可以使用Redis的有序集合(sorted set)和過期鍵(expire key)來實(shí)現(xiàn)。
首先,將訂單的超時(shí)時(shí)間作為分?jǐn)?shù),訂單ID作為成員,將訂單ID加入到有序集合中。例如,可以使用當(dāng)前時(shí)間戳加上訂單超時(shí)時(shí)間作為分?jǐn)?shù),訂單ID作為成員。
ZADD orders <timestamp + timeout> <order_id>
然后,使用Redis的ZREVRANGEBYSCORE
命令來獲取所有超時(shí)的訂單ID。這個(gè)命令可以根據(jù)分?jǐn)?shù)范圍獲取有序集合中的成員,并按分?jǐn)?shù)降序排列。
ZREVRANGEBYSCORE orders <current_timestamp> -inf
接下來,遍歷獲取到的超時(shí)訂單ID,使用Redis的DEL
命令來刪除訂單。
DEL <order_id>
最后,使用Redis的ZREMRANGEBYSCORE
命令來刪除已取消的訂單ID。
ZREMRANGEBYSCORE orders -inf <current_timestamp>
為了防止訂單在超時(shí)后又被處理,可以在訂單處理時(shí)設(shè)置一個(gè)過期鍵,當(dāng)訂單被處理后,將訂單ID作為鍵,設(shè)置一個(gè)過期時(shí)間。如果訂單在超時(shí)后被處理,那么在超時(shí)檢查時(shí),會(huì)發(fā)現(xiàn)訂單ID已經(jīng)存在,從而不會(huì)將其視為超時(shí)訂單。
這樣,就可以實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能??梢允褂枚〞r(shí)任務(wù)或者輪詢來定期檢查超時(shí)訂單。