Redis の expire はいつ実際にデータを消しているのか?

expire で指定した時間を過ぎたデータが実際に消されるタイミングはいつなのかということを調べた。

どこから調べたの

公式ドキュメントのexpireのところ から調べた

で、どうやって消してるの

Redis は expire で指定した時間が過ぎたデータを消すのにふたつの戦略を使ってる。

  • 値が取得されるときに消すよ

    • 値が取得されるときに、その値がすでに expire 過ぎてたら消す。
  • 値が取得されなくても消すよ

    • 値が取得されるときに消す感じだと、たまにしか取得されないデータとかあるいは全然取得されないみたなデータはいつまでも消えなくて困るよね
    • 値が取得されなくても定期的に消そうねって感じで消す。Redis さんは以下のような感じで消してるらしい
      1. まずランダムに20個のキーを選ぶ
      2. 選んだキーのデータが expire 過ぎてたら消す
      3. 25 個より多くの key が expired だったら1からもう一度繰り返す

まとめ

という感じで、「もう expired なのに内部では生きててリソースを圧迫しちゃう」みたいなデータは常にだいたい 25% 以下には抑えられるような仕組みにはなってる。

でも確率的に消すものなので、たとえば「1日後には参照したいんだけど2日後にはもう絶対に参照されないから2日後には消したい」みたいな使いかたする場合は、「expireで2日後を指定しておけばいいやー」みたいなことすると最悪25%のゴミデータが溜まる可能性はある。一定の期間を過ぎたら絶対に参照されなくなるみたいなデータに関しては可能なら明示的にdelしてあげたほうがいいんじゃないかなーって感じですね。