EXPIRE seconds

Redis 開発者教育の申込 Redis 定期点検/技術サポート
Redis Technical Support
Redis エンタープライズサーバー
Redis Enterprise Server

指定した時間(秒)後に key を自動削除

使い方は expire key seconds [type] です。
📍 type は string/list/set/zset/hash/stream のいずれかです。
      ent811 から type が追加されました。必ず使用してください。

Example

コマンド>set key value
結果>1
コマンド>expire key 5 string
結果>1
コマンド>ttl key string
結果>3
コマンド>ttl key string
結果>-2
コマンド>get key
結果>(nil)

アニメーションを見る


set コマンドで上書きすると expire time が解除されます

expire time が設定された後、同じ key に set コマンドが実行されると expire time が解除され、削除されません。
このようなコマンドには set, getset があります。
incr, lpush, sadd, zadd, hset のようなコマンドは該当しません。

Example

コマンド>set key value
結果>1
コマンド>expire key 5 string
結果>1
コマンド>ttl key string
結果>3
コマンド>set key new_value
結果>1
コマンド>ttl key string
結果>-1
コマンド>get key
結果>new_value

アニメーションを見る


rename では expire time は解除されません

key name を変更しても expire time は解除されません。

Example

コマンド>set key value
結果>1
コマンド>expire key 5 string
結果>1
コマンド>rename key new_key string
結果>OK
コマンド>ttl key string
結果>-2
コマンド>get key
結果>(nil)

アニメーションを見る


EXPIRE コマンド実行後に Redis サーバーがダウンした場合

ダウンした後、expire で指定した時間より後にサーバーが起動した場合はどうなるでしょうか。
サーバー起動時に expire time を check して del コマンドを実行します。
実際には、expire コマンドを実行しても AOF には expireat として記録されます。

Example

コマンド>set key value
結果>1
コマンド>expire key 5 string
結果>1
コマンド>shutdown
コマンド>Redis Server Start   10秒後に起動  
結果>del key10   自動実行  

Expire が設定されたキーを削除する 3つの場合

1) 周期的(1秒に 10回)に期限切れのキーを削除

1秒に 10回(100ms ごと)実行される serverCron()->databasesCron() で activeExpireCycle() を実行し、期限切れのキーを削除します。
📚 周期は redis.conf hz 値によって決まります。'10' なら 1秒に 10回、'20' なら 1秒に 20回実行されます。
このときは activeExpireCycle() を SLOW type で実行します。  SLOW type は実行制限時間が 25ms に設定されています。  ただし 25ms を超えて実行されることもあります。  キーが expire したかを random に検査し、1セット(20回ずつ 16回繰り返し、 合計 160回)を実行して所要時間を検査し、25ms を過ぎていれば終了します。
25ms を過ぎていなければ、再び 1セット(20回 * 16回)を繰り返して所要時間を再検査します。  このような方式で進むため、所要時間が 25ms 以上になることがあります。  たとえば 1セットの実行に 10ms かかる場合、2セット目は 20ms で制限時間 25ms 以下なので通過し、 3セット目の実行後 30ms のときに比較して 25ms 以上なので終了します。  削除するキーが多く、フィールドが多い hash キーの場合、1セットが 50ms かかることもあります。 すると 100ms ごとに実行され、50ms を使った場合は CPU 使用率が 50% になります。
info stats コマンドを実行すると expired_time_cap_reached_count 値が表示され、これが 25ms 以上実行された count です。

2) コマンド実行が終わるたびに期限切れのキーを削除

コマンド実行が終わるたびに beforeSleep() で activeExpireCycle() を実行し、期限切れのキーを削除します。
このときは FAST type で実行し、制限時間は 1ms と短いです。  ただし FAST type も上記と同様に 1セットが 20回 * 16回単位で実行されるため、 削除するキーがある場合、一般的に 5ms 以上かかります。

3) 各コマンドで該当キー 1つだけを削除

各コマンドを実行するとき、主処理を実行する前にキーが期限切れかを確認し、期限切れなら削除します。
たとえば get key コマンドを実行すると "key" があるかを確認し、あれば expire time を確認して expire していれば key を削除し、クライアントに null を返します。  Expire time がまだ過ぎていないか expire time がなければ value を返します。


期限切れキーの削除と CPU 使用率


📚<1番目の画像>
  • Redis サーバーでは 1秒に 10回(redis.conf hz) 期限日時が設定されたキーを削除します。
  • Commands/sec の 17:50 時間帯を見ると、コマンドは実行されていません。 しかし CPU 使用率(%) は最大 50% まで上がっていることを確認できます。
  • メモリ(RSS) 使用量 は 17:49 から期限日時が設定されたキーが削除され、使用量が減っています。
  • この場合、約 1,500万個のキーが 5分間で削除されました。秒あたり平均 5万個のキーが削除されたことになります。
    Peak 時間帯には約 7万個まで削除したと考えられるため、CPU を 50% まで使用したことになります。
  • このケースを説明する理由: 新しいコマンドが入力されなくても CPU を使用することがあること、 DEL コマンドが実行されなくても期限日時が設定されたキーが自動削除され、キー個数とメモリ使用量が減ることがあることです。


構文

EXPIRE key seconds [type]

  • このコマンドは version 1.0.0 から使用できます。
  • 時間計算量は O(1) です。
  • ent811 type 追加。
関連コマンド SETEX, TTL, PERSIST, PSETEX, EXPIREAT, PEXPIRE, PEXPIREAT, PTTL
Clients for Java Jedis, Lettuce, Redisson
Clients for C Hiredis

<< RENAMENX EXPIRE EXPIREAT >>

Email 返事がかかってなれば、メールでお知らせします。