【入門編】 LRU系Evictionポリシー – Redis

こんにちは、若きエンジニアの皆さん。Redisの世界へようこそ。

私はこれまで、数えきれないほどのシステムをRedisで救ってきました。Redisは「ただの速い箱」ではありません。その中には、限られた「メモリ」という資源を極限まで使い倒すための、職人芸のような知恵が詰まっています。

今日は、Redisを使っていると必ずぶつかる壁——「メモリがいっぱいになったらどうなるの?」という疑問についてお話ししましょう。

ここをマスターすれば、あなたは単に「Redisを使える人」から「Redisの心を知るエンジニア」へと一歩近づけますよ。

—

1. Redisという名の「限られた机」

想像してみてください。あなたの目の前には、とても小さな、でも驚くほど作業効率の良い「魔法の机」があります。これがRedisのメモリです。

仕事(データ)がどんどん入ってくると、机の上はすぐに書類でいっぱいになります。これ以上新しい書類を置けなくなったとき、あなたならどうしますか?

1. 「もう無理です!」と仕事を断る(エラーを出す)
2. 「古い書類」をそっと片付けて、新しい場所を作る

多くの現場で選ばれるのは後者です。この「古いものを片付ける仕組み」のことを、専門用語でEviction(エビクション:追い出し)と呼びます。

—

2. 「LRU」—— 誰を追い出すか決める賢いルール

片付けるときに一番合理的なのは、「最近一番使っていないもの」を捨てることですよね。これをLRU (Least Recently Used)と言います。

Redisには、このLRUをベースにした2つの代表的な設定(ポリシー)があります。

① allkeys-lru:すべてのデータが対象

「どんな種類のデータだろうと、使っていないものから順に捨てていく」という、とてもシンプルで公平なルールです。

  • 向いているケース: Redisを「一時的なキャッシュ」として割り切って使っている場合。

② volatile-lru:期限付きのデータだけが対象

「いつか消える設定(TTL)にしているデータ」の中から、使っていないものを捨てます。

  • 向いているケース: 「絶対に消したくない設定値」と「消えてもいいキャッシュ」が混ざっている場合。

> 先輩のアドバイス: 初心者の方は、まずは `allkeys-lru` を検討してみてください。これが最も効率よくメモリを使い切るための「王道」の設定です。

—

3. なぜRedisは「だいたい(近似)」で済ませるのか?

ここからが、Redisの設計思想の面白いところです。
実は、Redisは「厳密なLRU」を行いません。 あくまで「近似(だいたい)LRU」なのです。

なぜでしょうか?

完璧なLRUをやろうとすると、データを触るたびに「このデータが最新です!」というリストを並べ替え続けなければなりません。数百万個のデータがある中でこれをやると、Redisの命である「超高速」が損なわれてしまうのです。

そこでRedisの作者はこう考えました。
「全部を完璧に並べ替えなくても、適当に数個ピックアップして、その中で一番古いやつを捨てれば十分じゃないか?」

これが、Redisが世界最速を維持できている「割り切り」の美学です。

—

4. 魔法の数字 `maxmemory-samples`

この「適当に数個ピックアップする」ときの「数」を決めるのが、`maxmemory-samples` という設定値です(デフォルトは5)。

  • サンプル数が5の場合: 5つのデータをランダムに選び、その中で一番古いものを捨てる。
  • サンプル数を増やす(例:10): より正確に「一番古いもの」を見つけられるが、少しだけ計算に時間がかかる。

redis.conf の設定例
メモリがいっぱいになったら、すべてのキーからLRUで追い出す
maxmemory-policy allkeys-lru

追い出す候補を探すときのサンプル数。
5がバランスが良いですが、精度を上げたいなら10に。
maxmemory-samples 5

例えるなら、「クラスで一番背が高い人を探すとき、全員を並ばせる(厳密なLRU)のではなく、ランダムに5人選んでその中で一番高い人を決める(近似LRU)」ようなものです。5人でも、何度も繰り返せば結果的に高い人たちが残っていきますよね。

—

5. 実践:設定を確認してみよう

自分のRedisが今どんな設定になっているか、コマンドで覗いてみましょう。

現在の追い出しポリシーを確認する
redis-cli config get maxmemory-policy
結果例: 1) “maxmemory-policy” 2) “noeviction” (初期値はエラーを出す設定が多いです)

ポリシーを allkeys-lru に変更してみる
redis-cli config set maxmemory-policy allkeys-lru

サンプル数を確認する
redis-cli config get maxmemory-samples
結果例: 1) “maxmemory-samples” 2) “5”

まとめ:あなたへのメッセージ

Redisのメモリ管理は、「完璧さ」よりも「速さ」と「効率」を重視して設計されています。

1. `allkeys-lru` は、メモリを最大限に活用する魔法。
2. 近似LRU は、速さを守るための賢い手抜き。
3. `maxmemory-samples` は、精度と速度のバランス調整。

ここを理解できれば、あなたはもうRedisの初心者ではありません。データの寿命をコントロールし、システムを安定させる立派な設計者への道を歩み始めています。

もし設定に迷ったら、まずは `allkeys-lru` を試してみてください。それが、多くの荒波を乗り越えてきた私からの最初のアドバイスです。

また次のステップでお会いしましょう。応援していますよ!

コメント

タイトルとURLをコピーしました