【入門編】 maxmemory-samplesのチューニング – Redis

Redisの「断捨離」の深層:`maxmemory-samples` で学ぶスピードと精度の絶妙なバランス

こんにちは!Redisの世界へようこそ。
日々開発を進めていると、「Redisのメモリがいっぱいになったらどうなるんだろう?」という疑問にぶつかることがありますよね。

Redisは、あらかじめ決めておいたメモリ上限を超えると、古いデータを自動的に削除して新しいデータのための空きスペースを作ってくれます。いわば「データの自動断捨離(淘汰)」です。

今回は、その断捨離の「丁寧さ」を調整する重要な設定、`maxmemory-samples`(マックスメモリ・サンプルズ)について、日常の例えを交えながらじっくり紐解いていきましょう。

ここをクリアすれば、Redisのメモリ管理の基本と「トレードオフ(あちらを立てればこちらが立たぬ関係)」の本質はバッチリマスターできますよ!

—

1. Redisの「断捨離」はなぜ“完璧”を目指さないのか?

まず、少し意外な事実をお伝えします。
Redisは、データを捨てる時に「一番古いデータを完全に厳密に探して捨てる」ということはしていません。

「えっ、一番古いものを正確に捨ててくれないの?」と驚くかもしれませんね。

日常の例え:部屋の大掃除

あなたが足の踏み場もないほど散らかった部屋を片付けるとします。
完璧を目指すなら、部屋にあるすべてのモノ(服、本、書類…何万点)の購入日をメモして、最も古い1点を探し出さなければなりません。でも、そんなことをしていたら片付けだけで丸一日が終わってしまいますよね。

Redisもまったく同じです。
Redisは「超高速で動くこと」が命のデータベースです。何百万個、何億個とあるデータすべてをチェックして「一番古いデータ」を厳密に探すと、その間Redisの動きが止まってしまい、Webサービス全体の反応が遅くなってしまいます。

そこでRedisは、「ランダムに数個だけ手にとって、その中で一番古いものを捨てる」という賢い“手抜き(近似アルゴリズム)”を行っているのです。

—

2. `maxmemory-samples` とは「手にとる数」のこと

ここで登場するのが、今回の主役である `maxmemory-samples` です。

`maxmemory-samples` は、Redisが断捨離するときに「ランダムにピックアップして比較するデータの件数」を指定するパラメータです。

  • 例:`maxmemory-samples 5`(デフォルト値)
  • メモリが満杯になったら、ランダムに 5個 のデータをパッと見比べる。
  • その5個の中で「一番使われていないデータ」を1個選んで捨てる。

とてもシンプルですよね!

—

3. 「サンプル数」を変えると何が起きる?(トレードオフの解説)

この `maxmemory-samples` の値を増やすか減らすかで、Redisの挙動は大きく変わります。ここがチューニングの面白いところです。

【サンプル数が少ない(例: 3)】
スピード:⚡️ 超高速!
精度 :😅 あまり古くない大事なデータまで間違って捨てちゃうかも…

【サンプル数が多い(例: 10)】
スピード:🐢 少し頭を使う(CPUに負荷がかかる)
精度 :🎯 ほぼ完璧に「一番古いデータ」を見極めて捨てられる!

サンプル数が少ない場合(スピード優先)

  • メリット: チェックする数が少ないので、CPUに負担をかけず、瞬時に空き容量を作れます。
  • デメリット: たった3個の中から選ぶため、「運悪く、最近使ったばかりのデータばかり3個選ばれてしまい、その中では一番古いけれど、実はまだ必要なデータ」を捨ててしまう危険があります。

サンプル数が多い場合(精度優先)

  • メリット: 10個、20個と比較対象を増やすことで、本当の意味で「一番使われていない不要なデータ」を正確に狙い撃ちして捨てられます。
  • デメリット: チェックする数が増える分、Redisの脳みそ(CPU)を余計に使ってしまい、全体の処理スピードがわずかに落ちます。

—

4. 実際の確認と設定方法を見てみよう

実際にRedisでこの設定をどう扱うのか、コマンド例を見てみましょう。
初心者の方も、黒い画面(ターミナル)で試すイメージで眺めてみてくださいね。

現在の設定値を確認する

まずは、現在のRedisがいくつのサンプル数で動いているかを確認します。

Redisに接続して設定値を取得します
127.0.0.1:6379> CONFIG GET maxmemory-samples

実行結果例:
1) “maxmemory-samples”
2) “5” <-- デフォルト値の「5」が設定されています

一時的に設定変更してみる(リアルタイム変更)

Redisを再起動せずに、即座に設定を変更することも可能です。

サンプル数を「10」に変更して、断捨離の精度を上げてみる
127.0.0.1:6379> CONFIG SET maxmemory-samples 10

実行結果:
OK <-- 無事に設定が反映されました!

永続的に設定する(設定ファイル `redis.conf`)

Redisを再起動しても設定が消えないようにするには、設定ファイル(`redis.conf`)に以下のように書き込みます。

redis.conf の中に記述します
メモリ溢れ時のサンプル数を 10 に設定(精度重視のチューニング)
maxmemory-samples 10

—

5. 初心者が覚えておくべき「運用のベストプラクティス」

では、実際の現場ではどのように設定するのが正解なのでしょうか?
伝説のアーキテクトとしての答えは、「まずはデフォルトの `5` のままでOK」です!

実は、Redisの開発チームによる実験で、以下のことが分かっています。

  • サンプル数 5(デフォルト): 完璧なLRU(最も使われていないデータを捨てる理論値)にかなり近い精度が出ます。バランスが最強です。
  • サンプル数 10: ほぼ真のLRUと同じ精度になりますが、CPUの負荷が少し増えます。
  • サンプル数 3: スピードは速いですが、間違って新しいデータを消してしまう確率が目立って増えます。

アドバイスのまとめ

1. 基本は `5` のまま触らない!(Redis公式が最適化したゴールデンバランスです)
2. 「データが消える精度」をどうしても高めたい場合のみ `10` に上げる

  • 例:キャッシュのヒット率をコンマ数%でも上げたい、かつCPUパワーに十分な余裕がある場合。

3. `15` 以上には基本的にしない

  • チェックに時間を使いすぎて、Redisの強みである「高速性」が失われてしまいます。

—

まとめ

今回の学びを振り返ってみましょう。

  • Redisはメモリ満杯時、「ランダムに抽出したデータの中で一番古いものを捨てる」仕組み(近似アルゴリズム)を使っている。
  • `maxmemory-samples` は、その時に手にとるサンプルの件数である。
  • サンプル数を増やす = 捨てる精度が上がるが、CPU負荷が増える。
  • サンプル数を減らす = スピードは上がるが、必要なデータまで捨ててしまうリスクが増える。
  • 迷ったらデフォルト値の `5` がベストバランス!

Redisのメモリ管理は、「完璧を目指さず、ほどほどに賢くサボる」という計算された美しさの上で成り立っています。このメカニズムを理解できたあなたは、もうRedisの仕組みを一歩深く理解した立派なエンジニアです!

焦らず一歩ずつ、楽しみながらRedisマスターへの道を歩んでいきましょうね。応援しています!

コメント

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