Redis でタイムアウトで自動的にキャンセルされる注文の実装
Redisのソート済みセットと有効期限キーを使用して、注文のタイムアウトによる自動キャンセル機能を実装できます。
まず、注文のタイムアウト時間をスコアとして、注文IDをメンバーとして、注文IDをソートされた集合に追加します。たとえば、現在のタイムスタンプに注文のタイムアウト時間を加えたものをスコアとして、注文IDをメンバーとして使用できます。
ZADD orders <timestamp + timeout> <order_id>
そして、Redis の ZREVRANGEBYSCORE コマンドを使用して、タイムアウトの全てのオーダー ID を取得します。このコマンドは、スコア範囲で、並べ替えられたセットからメンバーを取得でき、スコアを降順で並べ替えます。
ZREVRANGEBYSCORE orders <current_timestamp> -inf
次に、取得したタイムアウト注文IDを全て走査し、RedisのDELコマンドを使用して注文を削除する。
DEL <order_id>
最後に、キャンセルされた注文 ID を削除するために、Redis の ZREMRANGEBYSCORE コマンドを使用する
ZREMRANGEBYSCORE orders -inf <current_timestamp>
タイムアウト後に注文が再処理されるのを防ぐには、注文処理時にタイムアウトキーを設定します。注文処理が完了したら、注文IDをキーとして、タイムアウト時間を設定します。タイムアウト後に注文が処理された場合、タイムアウトチェック時に注文IDが既に存在していることが判明するため、タイムアウト注文とはみなされません。
それにより、一定時間が経過した未処理注文を自動的にキャンセルする機能を実現できます。定期的に未処理注文の確認を行うには、タイマーによるタスクまたはポーリングを使用することができます。