こんにちは、若きエンジニアの皆さん。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` を試してみてください。それが、多くの荒波を乗り越えてきた私からの最初のアドバイスです。
また次のステップでお会いしましょう。応援していますよ!
コメント