こんにちは!Redisの世界へようこそ。
今日は、Redisを実務で使う上で絶対に避けて通れない、しかし初学者が一番最初に躓きやすい「メモリ管理の核心」についてお話ししますね。
「Redisってとにかく爆速で最高!」と言ってデータをどんどん放り込んでいたら、ある日突然サーバーが強制終了した……。そんな悲劇を防ぐための魔法の呪文、それが `maxmemory` です。
ここさえしっかりとクリアすれば、あなたのRedis運用スキルは一気にプロの領域に近づきます。さあ、一緒に本質をマスターしていきましょう!
—
1. なぜRedisはメモリがいっぱいになるとパニックになるのか?
まず、Redisの性質を身近なもので例えてみましょう。
Redisは、例えるなら「超高速な作業机」です。データをすべてメモリ(RAM)という机の上に広げるからこそ、一瞬でデータを見つけて取り出すことができます。
しかし、この作業机には物理的な限界(容量)があります。
もし、机の広さが「10GB」しかないのに、そこに「15GB」の書類を無理やり広げようとしたらどうなるでしょうか? 机から書類が床にあふれ、最悪の場合、部屋全体がギュウギュウ詰めになって動かなくなってしまいますよね。
コンピュータの世界でも全く同じことが起きます。
Redisが使えるメモリの限界を設定しておかないと、RedisはOS(サーバーの基本ソフト)が管理しているメモリを限界まで食い尽くし、最終的にサーバー全体の動きが止まったり、OSの「安全装置(OOM Killer)」が発動してRedisが強制終了(クラッシュ)させられるという大惨事につながります。
これを防ぐための「机の境界線」こそが、`maxmemory` 設定なのです。
—
2. `maxmemory` が物理メモリに対して持つ「本当の意味」
`maxmemory` とは、一言で言うと「Redisがこれ以上メモリを使ってはいけないという上限値」です。
例えば、サーバーの物理メモリが「16GB」だとします。この時、`maxmemory` を「16GB」に設定すればいいのでしょうか?
答えは「絶対によろしくない(NG)」です。
ここが、初心者がやりがちな最初の大きな罠です。
サーバーの中は「シェアハウス」
あなたのサーバーは、Redis専用の独占物件ではありません。
- OS自体も動くためにメモリを使います。
- 他のアプリケーション(Webサーバーやデータベースなど)も同居しています。
- Redis自体も、データを処理する瞬間に一時的な作業スペース(メモリ)を必要とします。
もし物理メモリの限界まで `maxmemory` を設定してしまうと、Redis以外の住人(OSなど)の居場所がなくなってしまい、サーバー全体がフリーズしてしまいます。
先輩エンジニアからの黄金律
実務での鉄則として、物理メモリに対して `maxmemory` は余裕を持った値(通常は物理メモリの50%〜70%程度、あるいはOSや他アプリの容量を引いた残りの安全なサイズ)に設定します。
> ここがポイント!
> `maxmemory` は、「Redisに与える最大の贅沢品(上限)」を決める設定であると同時に、「サーバー全体を守るための最後の防壁」という意味を持っているのです。
—
3. 設定をのぞいてみよう(実践編)
実際に、Redisの設定ファイル(`redis.conf`)や、動いているRedisに対してどのように設定するかを見てみましょう。
設定ファイルの例 (`redis.conf`)
設定ファイルの中では、以下のようにバイト単位やギガバイト単位で指定します。
Redisが使用できる最大メモリを「2ギガバイト」に制限する
maxmemory 2gb
または、メガバイトで指定する場合(2048MB = 2GB)
maxmemory 2048mb
コマンドで動的に確認・変更する
すでに動いているRedisに対して、今どうなっているかを確認したり、その場で変更したりすることもできます。
現在の maxmemory の設定値を確認する
127.0.0.1:6379> CONFIG GET maxmemory
1) “maxmemory”
2) “0” # 「0」は無制限(=物理メモリの限界まで使う)を意味します
> ⚠️ 注意!
> デフォルトの状態(`0`)は「制限なし」です。本番環境でこれを放置するのは、ブレーキの壊れたスポーツカーに乗るようなものです。必ず適切な値を設定しましょう。
実行中に値を変更したい場合は、このように指定します(例:2GBに制限する場合)。
127.0.0.1:6379> CONFIG SET maxmemory 2147483648
OK
※ 2147483648バイト = 2GB です
—
4. メモリが限界に達した時、Redisはどう振る舞うべきか?
さて、`maxmemory` で「ここまでね!」と上限を決めました。では、実際にデータがその上限に達したとき、Redisは新しくデータを書き込もうとしたらどうなるでしょうか?
「もう机がいっぱいで入りません!」とエラーを返すだけではありません。Redisには、ここから先を賢く乗り切るための「メモリがいっぱいになったときのポリシー(`maxmemory-policy`)」という仕組みが用意されています。
例えば、
- 「最近まったく使われていない古いデータを勝手に捨てて、新しいスペースを作る(LRU方式)」
- 「エラーを返して、これ以上の書き込みを拒否する」
など、ビジネスの要件に合わせて動きを選ぶことができます。このポリシーの設定と組み合わせることで、`maxmemory` は真価を発揮します。
—
まとめ
いかがでしたでしょうか?
`maxmemory` 設定の本質をまとめると、以下のようになります。
1. Redisの暴走を防ぎ、サーバー全体のクラッシュを守る命綱である。
2. 物理メモリの限界いっぱいに設定するのではなく、OSや他のアプリの分を考慮して「引き算」して決める。
3. デフォルト(制限なし)のまま本番環境で運用しては絶対にダメ。
ここをしっかりと押さえておけば、メモリ管理で冷や汗をかくようなトラブルを未然に防ぐことができます。
さあ、ここをクリアしたあなたなら、Redisのメモリ管理の基本はもうバッチリマスターできましたよ!自信を持って、次のステップへ進んでいきましょう。
コメント