こんにちは!Redisの世界へようこそ。
データベースの世界では、「データを保存する」ことと同じくらい、「不要になった古いデータを綺麗に片付ける」ことが重要です。
特に、キャッシュとしてRedisを使う場合、「このデータは1時間後には不要だよ」というように、有効期限(EXPIRE)を設定することがよくありますよね。
「あれ? 有効期限が切れたデータって、一体どのタイミングでメモリから消えているんだろう?」
ふと、そんな疑問を持ったことはありませんか?
今回は、Redisが裏側でどのように期限切れのキーを掃除しているのか、その知られざる仕組みを分かりやすく解説していきますね。ここをクリアすれば、Redisのメモリ管理の基本はバッチリマスターできますよ!
—
例え話:冷蔵庫の「賞味期限」で考えてみよう
Redisのメモリは、いわば「容量が限られた優秀な冷蔵庫」です。
そして、EXPIREを設定したキーは、冷蔵庫に入れた「食材(お惣菜)」だと思ってください。
お惣菜には「明日まで」という賞味期限(有効期限)があります。この賞味期限が切れたとき、冷蔵庫の中では一体どんなドラマが起きているでしょうか?
Redisが古いデータを片付ける方法には、大きく分けて2つのアプローチがあります。
1. パッシブ削除(受動的なお片付け)
2. アクティブ削除(能動的なおッチェック)
順番に、優しく紐解いていきましょう。
—
1. パッシブ削除(受動的なお片付け)
どんな仕組み?
これは、「誰かがその食材を取り出そうとした瞬間にお片付けする」方法です。
あなたが冷蔵庫を開けて、「昨日のポテトサラダを食べよう!」と手を伸ばしたとします。そこで賞味期限が切れていることに気づいたら、「あ、これもうダメだね」とその場でゴミ箱に捨てますよね。これがパッシブ削除です。
Redisでも全く同じことが起きています。
クライアントが「このキーの値を教えて!」と要求(GETなど)してきた時、Redisはそのキーの有効期限をチェックします。もし期限が切れていれば、その場でデータを削除し、「そんなキーはありませんよ(nil)」と返答します。
メリットと限界
- メリット: 無駄なCPUパワーを使いません。アクセスされた時にだけチェックするからです。
- 限界: 誰もアクセスしない限り、永遠に残り続ける可能性があります。冷蔵庫の奥底に眠ったままの古いお惣菜状態ですね。これだけだとメモリがパンクしてしまいます。
—
2. アクティブ削除(能動的なおッチェック)
どんな仕組み?
パッシブ削除の弱点を補うのが、このアクティブ削除です。
これは、「冷蔵庫の番人が、定期的に巡回して傷んでいる食材をチェックして捨てる」方法です。
Redisの内部では、バックグラウンドで一定間隔(デフォルトでは1秒間に10回!)ごとに、以下のようなパトロールが行われています。
1. 有効期限が設定されているキーの中から、ランダムにいくつかのキーをピックアップする。
2. その中で「すでに期限が切れているもの」をすべて見つけて削除する。
3. もし期限切れのキーが多すぎたら(全体の25%以上など)、すぐにパトロールをもう一度やり直す。
ここがRedisのすごいところ(職人技)
すべてのキーの期限を毎秒チェックしていたら、Redisの心臓部であるCPUが過労死してしまいます。
だからRedisは、「ランダムにいくつか選んでチェックする(サンプリング)」という賢い手抜きをしています。全部を完璧に見ない代わりに、高速に動作し続ける。この絶妙なバランス感覚こそが、Redisが超高速である秘密の一つです。
—
コードで動きを見てみよう
実際にRedisを動かして、期限切れの挙動を確認してみましょう。
ターミナルでRedisを操作するイメージを持ってみてください。
1. 「session:123」というキーに、有効期限「10秒」を設定してデータを保存します
127.0.0.1:6379> SETEX session:123 10 “user_data_100”
OK
2. すぐに値を取得してみます(もちろん取得できます)
127.0.0.1:6379> GET session:123
“user_data_100”
— ここで10秒以上が経過したとします —
3. 再び値を取得しようとすると…(これが「パッシブ削除」の瞬間です!)
127.0.0.1:6379> GET session:123
(nil)
10秒経った後に `GET` を叩いた瞬間、Redisは裏側で期限切れを検知し、パッシブ削除を実行して `(nil)` を返しました。
—
まとめ:私たちが意識すべきこと
いかがでしたでしょうか? Redisのキー削除の裏側には、以下の2つの工夫がありました。
- パッシブ削除: キーにアクセスされた時に「あ、切れてる!」と気づいて消す。
- アクティブ削除: 裏側で定期的にパトロールして、ランダムに古いキーを掃除する。
この仕組みを知っていると、システムを設計する上で大きな武器になります。
例えば、「どうしても一瞬たりとも古いデータを残したくない!」という厳密な要件がある場合、アクティブ削除の網をすり抜ける可能性があることを考慮し、パッシブ削除(アクセス時の判定)に頼りすぎない設計を考えることができます。
Redisは、こうした細かい工夫を積み重ねることで、限られたメモリを効率よく使い、あの圧倒的なスピードを実現しています。
基礎が分かれば、Redisを触るのがもっと楽しくなりますよ!
分からないところがあれば、いつでも先輩に聞いてくださいね。それでは、次のステップへ進みましょう!
コメント