【入門編】 Evictionによるレイテンシへの影響 – Redis

こんにちは!Redisの世界へようこそ。
今回は、Redisを運用する上で避けて通れない、しかし多くの人が見落としがちな「メモリとレイテンシ(応答速度)の深い関係」についてお話しします。

「Redisはとにかく速い」と聞いて使い始めたものの、データが増えてくるとなぜか時々「カクつく」ようになった……そんな経験はありませんか?
実はその原因、Redisが裏側でひっそり行っている「お片付け」にあるんです。

ここをしっかりとクリアすれば、あなたのRedis運用のスキルは一段も二段もレベルアップしますよ。さあ、一緒に本質を見ていきましょう!

—

Redisは「超高速な作業机」である

まず、Redisの性質をイメージするために、日常の例え話をさせてください。

あなたは今、ものすごく広いオフィスで仕事をしているとします。その中心に、あなた専用の「超巨大な作業机(これがRedisのメモリです)」が置いてあります。
この机の上には、今すぐ使う書類や道具が山のように置いてあり、あなたは手を伸ばせば一瞬でそれを取り出すことができます。これが「Redisがミリ秒単位で爆速な理由」です。

しかし、この作業机には物理的な限界(メモリの上限、`maxmemory`設定)があります。
新しい書類を置こうにも、もう机の上のスペースはパンパンです。「あぁ、これ以上置けない!」となったとき、あなたはどうしますか?

これが、Redisにおける「メモリ不足(Eviction)」の瞬間です。

—

メモリがパンクしたとき、何が起きるのか?

机がパンパンの状態で、新しい仕事(データの書き込み)が舞い込んできました。
さて、どうしましょう? 新しいスペースを作るためには、机の上にある古い書類のどれかを捨てなければいけません。

ここで問題があります。
Redisのメインの頭脳(メインスレッド)は、「一人しかいない超優秀なあなた」です。

Redisは基本的に、すべての作業をたった一人の「シングルスレッド」でこなします。つまり、あなたが机の片付け(古いデータの削除)をしている間は、他のすべての仕事(ユーザーからの「このデータ教えて!」というリクエスト)が完全フリーズしてしまうのです。

これが、Eviction(削除処理)によるレイテンシ悪化の正体です。

「あれ? さっきまでサクサク動いていたのに、急に数秒間応答が止まったぞ?」という現象の裏では、この一人の担当者が、必死になって机の上の古い書類をシュレッダーにかけている姿があるわけです。

—

「お片付けのルール」を決めよう(maxmemory-policy)

では、このパニックを防ぐにはどうすればよいでしょうか?
答えは簡単です。「あらかじめ、机がいっぱいになったらどれを捨てるかルールを決めておく」ことです。

Redisには、机がパンパンになった時にどのデータを捨てるかを決める設定(`maxmemory-policy`)がいくつか用意されています。代表的なものをいくつか見てみましょう。

1. `noeviction`(デフォルト)

  • ルール: 「絶対に何も捨てない!」
  • 結果: 机がいっぱいになった状態で新しい書き込みが来ると、「もう無理です!」とエラーを返します。安全ですが、書き込みが止まってしまうため注意が必要です。

2. `allkeys-lru`

  • ルール: 「すべてのデータの中で、しばらく使っていない(Least Recently Used)古いものから捨てる」
  • 結果: キャッシュ用途として使う場合の一番のオススメです。最近アクセスされていない古いデータから自動で消えていきます。

3. `volatile-lru`

  • ルール: 「有効期限(TTL)が設定されているデータの中から、しばらく使っていない古いもの捨てる」
  • 結果: 消えては困る永続データと、消えてもいいキャッシュが混ざっている場合に便利です。

設定ファイル(`redis.conf`)では、このように指定します。

メモリの上限を2ギガバイトに設定する
maxmemory 2gb

メモリがいっぱいになったら、使っていない古いキャッシュから削除する
maxmemory-policy allkeys-lru

—

実務で使える!レイテンシ悪化を防ぐ3つの処方箋

ルールを決めるだけでも改善しますが、プロのエンジニアとして現場で実践している「根本的な回避策」を3つ授けましょう。

1. メモリに「余裕の余白」を持たせる(キャパシティプランニング)

机の限界ギリギリまでモノを置いてはいけません。経験則として、メモリは常に30%〜40%程度の余裕(余白)を持たせて運用するのが鉄則です。
「データが増えてきたな」と感じたら、早めにサーバーのプランを上げるか、データを分割しましょう。

2. すべてのデータに「賞味期限(TTL)」をつける

キャッシュとして使っているデータには、必ず有効期限を設定しましょう。
`EXPIRE`コマンドなどを使い、時間が経てば勝手に消えるようにしておけば、そもそも「机がパンパンになって慌てて片付ける」という状況自体を防げます。

例: ユーザーのセッション情報に「1時間(3600秒)」の有効期限を設定する
127.0.0.1:6379> SETEX session:1001 3600 “user_data_xyz”
丁寧なコメント: これにより、1時間後には自動で消滅するため、メモリを圧迫し続けません。
OK

3. 遅延の兆候をモニタリングする

Redisには、処理がどれくらい遅くなったかを記録する便利なコマンドがあります。
`INFO`コマンドや、遅い処理を記録するスローログを定期的に確認し、「最近、片付けで忙しくなっていないか?」を観察しましょう。

実行時間が長かったコマンドの履歴を確認する(例: 10件取得)
127.0.0.1:6379> SLOWLOG GET 10

—

おわりに

いかがでしたでしょうか?
RedisのEviction(メモリ不足時の削除)がなぜレイテンシに影響するのか、その仕組みと対策が見えてきたかと思います。

  • Redisはシングルスレッドで動く「超高速な作業机」である。
  • 机がいっぱいになると、片付け(削除)のために一時的に手が止まり、応答が遅くなる。
  • 適切な削除ポリシー(`allkeys-lru`など)を設定し、メモリに余裕を持たせた運用が不可欠。

ここをしっかりとクリアできれば、あなたの扱うRedisシステムは、どんな負荷がかかっても安定して爆速なレスポンスを返し続けるはずです。

日々の運用で「お片付け」に追われない、スマートなアーキテクチャを目指していきましょう。
それでは、次回の技術解説もお楽しみに!

コメント

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