こんにちは!Redisの世界へようこそ。
今回は、Redisを運用する上で避けて通れない、いや、ここを制する者がRedisを制すると言っても過言ではない「メモリ管理」の核心に迫ります。
テーマはずばり、「`maxmemory`(最大メモリ)設定の深掘り」です。
「Redisってメモリがなくなったらどうなっちゃうの?」
「設定値って、物理メモリと同じにすればいいの?」
そんな疑問を持ったことはありませんか?
大丈夫。今日は、物理メモリとRedisのルールの関係、そして「あふれそうになった時にどうやって片付けるのか(削除ポリシー)」を、専門用語をできるだけ使わずに、日常のたとえ話を交えながら優しく解きほぐしていきます。
ここをクリアすれば、あなたのRedis運用スキルはワンランク上のステージに上がります。さあ、一緒に本質をマスターしましょう!
—
1. 例え話で理解する「Redisのメモリ管理」
まずはイメージから入りましょう。
Redisを、「超高速でデータを取り出す、とある凄腕シェフの冷蔵庫」だと思ってください。
この冷蔵庫には、物理的な限界(物理メモリ)があります。例えば「500リットル」の冷蔵庫だとしましょう。
ここで重要になるのが、「冷蔵庫のサイズ(物理メモリ)」と「シェフが自分で決めた食材の限界ライン(maxmemory)」です。
物理メモリ = 冷蔵庫自体の大きさ
サーバ(コンピュータ)に搭載されている実際のメモリの容量です。もしサーバに16GBのメモリがあれば、冷蔵庫のサイズは16GBです。
maxmemory = 「ここまでしか食材を入れない」というシェフの自主ルール
冷蔵庫がパンパンになってドアが閉まらなくなったら大惨事ですよね?
そうなる前に、「うちは10GB以上は食材を入れない! 10GBを超えたら、古いものから片付けるルールにしよう」と決める、その上限ラインが `maxmemory` です。
> 💡 先輩からのアドバイス
> 「冷蔵庫(物理メモリ)が16GBだから、`maxmemory`も16GBでいいや!」……これは初心者がやりがちな最大の罠です。
> なぜなら、Redis自身が動くためにも少しメモリを使いますし、OS(オペレーティングシステム)もメモリを消費します。冷蔵庫のサイズギリギリまで設定すると、冷蔵庫以外の場所でエラーが起きてサーバ全体が倒れてしまいます。
> 一般的には、物理メモリの7割〜8割程度を `maxmemory` の上限として設定するのが、安全に暮らすための知恵ですよ。
—
2. パンク寸前!「maxmemory-policy」という名の片付け方
`maxmemory` で決めた上限(例えば10GB)に達したとき、新しい食材(データ)が入ってきたらどうなるでしょうか?
「これ以上入りません!」とエラーで弾き返すのか、それとも古いものを捨ててスペースを作るのか。
ここで登場するのが、`maxmemory-policy`(メモリ削除ポリシー)という設定です。これは例えるなら、「冷蔵庫がいっぱいになったとき、何をどうやって捨てるかのルール」です。
代表的なルールを3つ、分かりやすく見てみましょう。
① `noeviction` (絶対に捨てない主義)
- 意味: 「古いものも大切なデータだ!捨てるなんてとんでもない!」
- どうなる?: 容量がいっぱいになると、新しいデータの書き込みをすべて拒否(エラーを返す)します。
- 向いている用途: データを1バイトたりとも失いたくない絶対厳守のシステム(ただし運用は難易度高めです)。
② `allkeys-lru` (最近使ってないものを捨てる:一番人気)
- 意味: 「最近まったく顔を見ていない古い食材から処分するよ」
- どうなる?: すべてのデータの中から、「しばらくアクセスされていない(Least Recently Used)」ものを見つけ出して自動的に削除し、新しいスペースを作ります。
- 向いている用途: 迷ったらこれを選べば間違いなしの優等生。キャッシュサーバーとして使う場合の王道です。
③ `volatile-lru` (期限付きの古いものを捨てる)
- 意味: 「『いつか捨てる予定(有効期限がついている)』の食材の中で、最近使っていないものを処分するよ」
- どうなる?: 有効期限(TTL)が設定されているデータの中から、使われていない古いものを狙って消します。期限のない大事なデータは守られます。
- 向いている用途: ずっと残したいデータと、一時的なキャッシュが混在しているとき。
—
3. 削除ポリシーが「メモリ解放速度」に与える影響
さて、ここからが少しエンジニアらしい深い話です。
「古いものを捨てる」と言っても、Redisは裏側でどうやってそれをやっているのでしょうか?
実は、「どれを捨てるか」の選び方によって、Redisのスピード(メモリ解放速度)が変わるのです。
完全な「LRU」は実はコストが高い?
「一番使われていないデータ」を正確に完璧に見つけ出そうとすると、Redisはすべてのデータをチェックしなくてはなりません。データが数千万件あった場合、これをやるとRedisの動きがカクついてしまいます(シェフがどの食材が一番古いか台帳を何時間もめくって探している状態です)。
そのため、Redisは賢く妥協しています。
「完全な正確さ」ではなく、「ランダムにいくつか選んだ中から、一番古そうなやつを捨てる(近似LRUアルゴリズム)」という方法をとっています。
これにより、メモリがいっぱいになって新しいデータを入れるときの「もたつき(レイテンシ)」を防ぎ、常に秒速でシャキシャキと動くパフォーマンスを維持しているのです。この「スピードと正確さの絶妙なバランス」こそが、Redisが世界中で愛される理由の一つです。
—
4. 設定してみよう(実践の作法)
設定はとてもシンプルです。Redisの設定ファイル(`redis.conf`)に以下のように書き込みます。
最大メモリを 2ギガバイト に制限する
maxmemory 2gb
容量がいっぱいになったら、期限付きデータからLRU(使われていない順)で削除する
maxmemory-policy volatile-lru
もし動いているRedisに対して、コマンドでリアルタイムに変更したい場合は、ターミナルから `CONFIG SET` を使います。
実行例(redis-cliでの操作)
127.0.0.1:6379> CONFIG SET maxmemory 2147483648
OK
127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
OK
(※ `2147483648` は 2GB をバイト数で表したものです)
—
まとめ
いかがでしたでしょうか?
今日のポイントをギュッと凝縮して振り返ります。
1. `maxmemory` は物理メモリそのものではなく、サーバ全体の安全を守るための「自主的な上限ライン」(物理メモリの7〜8割が安全圏)。
2. `maxmemory-policy` は、限界が来たときにどうやって片付けるかのルール。
3. 迷ったら `allkeys-lru` を選んでおけば、Redisは賢く古いものを片付けて高速に走り続けてくれる。
ここをクリアできれば、あなたの作るRedis環境は、メモリあふれによる突然のクラッシュから守られ、いつでも安定した高速なパフォーマンスを発揮してくれるようになります。
Redisの仕組みが少し身近に感じられたなら嬉しいです。
それでは、次の冒険(最適化の世界)でお会いしましょう!バッチリマスターできましたね!
コメント