やあ。Redisの世界へようこそ。
Redisを「単なる高速なデータベース」だと思っているなら、それは非常にもったいない。Redisは、限られた「メモリ」という聖域をいかに効率よく使いこなすか、その知略を競うパズルゲームのようなものなんだ。
今日は、Redisの心臓部とも言える「メモリが満杯になったとき、誰を追い出すか?」という、最も重要かつ戦略的なテーマについて話そう。
—
「机の上の整理術」で考えるメモリ削除
想像してみてほしい。君のデスク(メモリ)の上には、仕事に必要な資料(データ)が散らばっている。でも、デスクは無限に広いわけじゃない。新しい資料を広げようとしたとき、デスクが満杯だったらどうする?
1. 「もう古いから捨てよう」(LRU:Least Recently Used)
2. 「全然使っていないから捨てよう」(LFU:Least Frequently Used)
3. 「期限切れだから捨てよう」(TTLベースの削除)
Redisもこれと全く同じことをしているんだ。これを「Eviction Policy(逐次削除ポリシー)」と呼ぶ。
—
1. LRU:最近使っていないものは「過去」のもの
LRU(Least Recently Used)は、最もポピュラーな戦略だ。「しばらく触っていない資料は、もう必要ないだろう」という考え方だね。
- どんな時におすすめ?:直近でよく使うデータほど価値が高い、という典型的なキャッシュ運用。
- Redisの挙動:最後にアクセスしてから一番時間が経っているデータから順番にシュレッダーにかける。
2. LFU:人気のないものは「去れ」
LFU(Least Frequently Used)は、「最後にいつ使ったか」ではなく「どれだけ頻繁に使ったか」を重視する。
- どんな時におすすめ?:特定のデータが極端に人気で、たまにしか使われないデータと混在しているとき。LRUだと「さっき一回開いただけ」のデータが残ってしまうが、LFUなら「みんなが何度も見ているデータ」を確実に守れる。
3. TTLベースの削除:賞味期限が切れたら「サヨナラ」
これは他のポリシーとは少し毛色が違う。データに「寿命(TTL: Time To Live)」を設定するんだ。
- 例:Webサイトのログインセッションや、一時的なクーポンコード。
- 仕組み:Redisは、期限が過ぎた瞬間に「あ、これもうゴミだ」と判断して掃除してくれる。
—
設定を変えてみよう(設定ファイルの魔法)
Redisの設定ファイル(`redis.conf`)を覗くと、`maxmemory-policy`という項目があるはずだ。ここが君の判断の分かれ道になる。
よく使われる設定例
メモリがいっぱいになったら、最近使われていないものから消す
maxmemory-policy allkeys-lru
メモリがいっぱいになったら、期限が設定されているものの中から古いものを消す
maxmemory-policy volatile-lru
初心者の君へアドバイスだ。「まずは `allkeys-lru` から始めなさい」。これが最も汎用的で、多くのケースで期待通りのパフォーマンスを出してくれる。
—
実務レベルの「知恵」:メモリは「空き」があってこそ
ここで、伝説的なアーキテクトからの忠告を一つ。
「メモリを100%使い切るような運用はしてはいけない」
メモリが限界に達すると、Redisは新しいデータを書き込むたびに「どれを消そうか」という計算(削除処理)を裏で始める。これがCPUを食い、せっかくのRedisの速度を落としてしまうんだ。
- 理想の運用:メモリの80%くらいを目安に運用し、余裕を持って動かす。
- 監視:`INFO memory` コマンドを叩いて、常にメモリの推移を眺める習慣をつけよう。
Redisに今のメモリ状態を聞いてみる
127.0.0.1:6379> INFO memory
戻り値の used_memory_human をチェック!
ここが maxmemory の設定値に近づいていないか監視するのがプロの仕事だ。
—
まとめ:Redisを飼いならすということ
Redisは、君が何もしなくても優秀な秘書のように振る舞ってくれる。でも、データの特性に合わせて「誰を優先的に残し、誰を捨てるか」というルール(ポリシー)を正しく設定してあげるだけで、そのパフォーマンスは劇的に変わるんだ。
まずは、自分の扱っているデータが「鮮度が命(LRU向き)」なのか「人気が命(LFU向き)」なのか、じっくり観察することから始めてみてほしい。
ここをクリアすれば、君はもうRedisの基本を完璧にマスターしたと言っていい。次は、もっと深い「メモリの断片化」の話でもしようか?
君のエンジニアリングが、より鋭く、より洗練されたものになることを期待しているよ。
コメント