expire で指定した時間を過ぎたデータが実際に消されるタイミングはいつなのかということを調べた。
どこから調べたの
公式ドキュメントのexpireのところ から調べた
で、どうやって消してるの
Redis は expire で指定した時間が過ぎたデータを消すのにふたつの戦略を使ってる。
値が取得されるときに消すよ
- 値が取得されるときに、その値がすでに expire 過ぎてたら消す。
値が取得されなくても消すよ
- 値が取得されるときに消す感じだと、たまにしか取得されないデータとかあるいは全然取得されないみたなデータはいつまでも消えなくて困るよね
- 値が取得されなくても定期的に消そうねって感じで消す。Redis さんは以下のような感じで消してるらしい
- まずランダムに20個のキーを選ぶ
- 選んだキーのデータが expire 過ぎてたら消す
- 25 個より多くの key が expired だったら1からもう一度繰り返す
まとめ
という感じで、「もう expired なのに内部では生きててリソースを圧迫しちゃう」みたいなデータは常にだいたい 25% 以下には抑えられるような仕組みにはなってる。
でも確率的に消すものなので、たとえば「1日後には参照したいんだけど2日後にはもう絶対に参照されないから2日後には消したい」みたいな使いかたする場合は、「expireで2日後を指定しておけばいいやー」みたいなことすると最悪25%のゴミデータが溜まる可能性はある。一定の期間を過ぎたら絶対に参照されなくなるみたいなデータに関しては可能なら明示的にdelしてあげたほうがいいんじゃないかなーって感じですね。