Redisのmaxmemory設定とは?メモリ管理とパフォーマンス向上の秘訣を初心者向けに解説
生徒
「データベースのRedis(レディス)を使い始めたのですが、『メモリがいっぱいになると動かなくなる』と聞きました。どうすればいいですか?」
先生
「それは大切なポイントですね。Redisはデータを『メモリ』という、読み書きが非常に速い場所に保存します。でも、メモリの容量には限りがあります。そこで登場するのが『maxmemory(マックスメモリ)』という設定です。」
生徒
「マックスメモリ……。最大容量を決めるということでしょうか?」
先生
「その通り!冷蔵庫に例えると、詰め込みすぎてドアが閉まらなくなる前に、『ここまでしか入れない』と決めて、古いものから捨てていくルールを作るようなものです。」
生徒
「勝手に捨てちゃうんですか!?なんだか難しそうですが、パソコン初心者でも設定できますか?」
先生
「大丈夫ですよ。どのくらいの量を保存するか、溢れた時にどう振る舞うかを指示するだけです。一緒に基本から見ていきましょう。」
1. Redisとメモリの基本を学ぼう
Redis(レディス)は、一般的なデータベース(MySQLなど)とは違い、「インメモリデータベース」と呼ばれます。これは、すべてのデータをコンピュータの「メモリ(主記憶装置)」に保存する仕組みのことです。
メモリとは何か?
パソコンやサーバーの中で、データを一時的に置いておく「作業机」のような場所です。机の上が広ければ広いほど、たくさんの書類を広げて素早く仕事ができますよね。Redisはこの「机の速さ」を最大限に活かしているので、データの読み書きが驚くほど高速なのです。
しかし、机の広さ(メモリ容量)には限界があります。もし、机の上が書類で山積みになり、これ以上何も置けなくなったらどうなるでしょうか?新しい仕事(データの追加)ができなくなり、システム全体が止まってしまいます。これを防ぐための安全装置が、maxmemory(マックスメモリ)設定なのです。
たくさんのデータを整理整頓して保存しておくための「倉庫」のようなソフトのことです。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. maxmemory設定の役割と重要性
「maxmemory」とは、Redisが使用できるメモリの上限値を指定する設定項目です。この設定をしないと、Redisはコンピュータにあるメモリを限界まで使い切ろうとします。メモリを使い切ってしまうと、サーバー自体が不安定になり、最悪の場合はクラッシュ(故障のように止まってしまうこと)してしまいます。
なぜ上限を決める必要があるの?
サーバーの中では、Redis以外にもOS(WindowsやLinuxなどの基本ソフト)が動いています。Redisがメモリを独占してしまうと、OSが動くためのスペースがなくなり、システム全体が「酸欠状態」になってしまうからです。初心者のうちは、「サーバー全体のメモリの7割から8割くらいを上限にする」のが一つの目安となります。
3. 実際に設定を確認・変更してみよう
それでは、Redisに対して「メモリをどれくらい使っていいか」を命令する方法を見てみましょう。Redisには専用のコマンドがあり、これを使って設定を操作します。
まずは、現在の設定を確認するコマンドです。ここでは、まだ上限が設定されていない状態を想定します。
CONFIG GET maxmemory;
このコマンドを実行した結果は、以下のようになります。
1) "maxmemory"
2) "0"
結果の「0」というのは、実は「無制限(メモリの許す限り全部使う)」という意味です。これでは危険なので、例えば「256MB(メガバイト)」に制限してみましょう。MB(メガバイト)やGB(ギガバイト)はデータの重さを表す単位です。
CONFIG SET maxmemory 256mb;
設定後の確認結果は、次のようになります。
1) "maxmemory"
2) "268435456"
数字が大きく見えますが、これは「バイト」という最小の単位に変換されているためです。これで、Redisは256MB以上のメモリを使わないようになります。机の広さをキッチリと区切った状態ですね。
4. メモリが一杯になった時のルール「Eviction Policy」
上限(maxmemory)を決めたのは良いですが、もしデータが増え続けて、その上限に達してしまったらどうなるでしょうか?新しいデータを保存しようとした時に、Redisは困ってしまいます。
そこで、「maxmemory-policy(マックスメモリ・ポリシー)」という設定を使います。これは、「上限に達した時に、どのデータを捨てるか、あるいはエラーにするか」というルール決めのことです。代表的なルール(ポリシー)には以下のようなものがあります。
- noeviction: 何も捨てない。代わりに新しいデータの追加を拒否してエラーを返す(一番安全ですが、更新が止まります)。
- allkeys-lru: 使われた時間が一番古いデータから順番に捨てて、新しいスペースを作る(よく使われる設定です)。
- volatile-lru: 「期限付き」として保存したデータの中から、古いものを捨てる。
LRU(エルアールユー)とは?
「Least Recently Used」の略で、「最近一番使われなかったもの」という意味です。洋服ダンスの整理で、1年以上着ていない服から捨てるようなイメージですね。効率的に空きスペースを作る賢い方法です。
現在のルールを確認してみましょう。
CONFIG GET maxmemory-policy;
1) "maxmemory-policy"
2) "noeviction"
初期設定では「noeviction(エラーを出す)」になっていることが多いです。これを「古いものから自動で捨てる(allkeys-lru)」に変更するコマンドは以下の通りです。
CONFIG SET maxmemory-policy allkeys-lru;
5. メモリ管理の注意点と運用テクニック
maxmemoryを設定する際には、いくつか気をつけるべき点があります。ただ数字を入れれば良いというわけではなく、システムの特性に合わせることが重要です。
適切なデータ型を選ぼう
Redisには、文字列だけでなく、リスト形式や地図のような形式など、様々なデータの持ち方(データ型)があります。効率の悪い持ち方をすると、あっという間にメモリを消費してしまいます。不要になったデータには必ず「有効期限(消えるまでの時間)」を設定する習慣をつけましょう。
断片化(フラグメンテーション)に注意
パソコンのメモリ管理では、データの追加と削除を繰り返しているうちに、メモリの中に小さな「隙間」ができてしまうことがあります。これを断片化と呼びます。実際のデータ量よりも、Redisが確保しているメモリ量が多く見える場合は、この隙間が原因かもしれません。
現在のメモリ使用状況を詳しく見るには、以下のコマンドを使います。
INFO memory;
実行すると、以下のようなたくさんの情報が出てきます。
used_memory:1048576
used_memory_human:1.00M
used_memory_peak:1572864
total_system_memory:17179869184
maxmemory:268435456
mem_fragmentation_ratio:1.24
ここで注目すべきは mem_fragmentation_ratio です。これが1.5を超えてくると、隙間だらけで効率が悪い状態と言えます。初心者の方は、まず used_memory_human を見て、「今どれくらい使っているか」を人間が読みやすい形式(1.00Mなど)で確認することから始めましょう。
6. パフォーマンスを落とさないためのポイント
Redisの最大の武器はスピードです。しかし、メモリ管理を疎かにすると、そのスピードが台無しになってしまいます。特に、上限に達してデータが次々と削除(Eviction)される状態になると、Redisはその削除作業に忙しくなり、本来のデータの受け渡しが遅くなることがあります。
解決策としてのモニタリング
時々 INFO memory コマンドを叩いて、使用量が上限に近づいていないかチェックしましょう。もし常に90%を超えているようなら、サーバーのメモリを増設するか、保存するデータを精査するタイミングです。
また、Redisはシングルスレッド(一度に一つの作業しかできない)という性質を持っています。膨大なデータを一度に消そうとすると、その間他の操作ができなくなるため、少しずつ整理されるように設定を工夫することがプロへの第一歩です。
7. トラブルを未然に防ぐ設定のコツ
最後に、初心者の方がやってしまいがちな失敗を防ぐためのコツをまとめます。Redisは非常に強力なツールですが、設定一つで牙を剥くこともあります。
スワップ(Swap)を避ける
メモリが足りなくなった時、コンピュータはハードディスク(遅い保存場所)をメモリの代わりに使おうとすることがあります。これを「スワップ」と言います。Redisでこれが発生すると、スピードが100倍以上遅くなることも珍しくありません。maxmemoryを正しく設定し、物理的なメモリの範囲内で動かすことが、Redisを快適に使うための鉄則です。
設定ファイル(redis.conf)への書き込み
先ほど CONFIG SET コマンドを使いましたが、これはRedisを再起動すると消えてしまいます。ずっと設定を有効にしたい場合は、redis.conf という設定ファイルに直接書き込むか、設定後に CONFIG REWRITE コマンドを実行して、現在の設定をファイルに保存するようにしましょう。
CONFIG REWRITE;
このコマンド一つで、苦労して決めた設定が永続的に守られるようになります。パソコン操作に慣れていない間は、設定を変えたら必ずこのコマンドを打つ、と覚えておくと安心です。