【入門編】 ストリームの永続化とトリミング – Redis

やあ。Redisの世界へようこそ。
Redisを「単なる高速なキャッシュ」だと思っているなら、それは大きな勘違いだ。Redisは、あなたのアプリケーションの「記憶」を司る、非常に洗練された心臓部になり得る。

今日は、Redisの機能の中でも特に強力な「Redis Stream(ストリーム)」について話をしよう。特に、データが無限に溜まってメモリを食いつぶさないようにするための「整理整頓術」だ。

エンジニアとして生き残るために、メモリという有限なリソースをどう賢く扱うか。この基本をマスターすれば、君はもうRedisの初級者を卒業だ。

—

1. 「ストリーム」は「終わりのない伝言板」

まず、Redisのストリームをイメージしてみよう。
これは「書き込み専用の終わりのない伝言板」だ。新しい情報が来るたびに、古い情報の後ろにペタペタと付箋が貼られていく。

しかし、現実は厳しい。もしこの伝言板に100万枚、1000万枚と付箋を貼り続けたらどうなる? そう、サーバーのメモリ(記憶領域)がパンクする。

そこで登場するのが「トリミング(枝切り)」という技術だ。

2. MAXLEN:あふれる前に「古いもの」を捨てる

ストリームにデータを送る(`XADD`)とき、実は「これ以上は貯めないで!」というルールを同時に設定できる。それが `MAXLEN` オプションだ。

例えるなら、「この伝言板には常に最新の100枚だけを残す」というルールを決めるようなものだ。

「mystream」というストリームに、最大100件までデータを保持する設定で送る
MAXLEN 100 と指定することで、101件目が入ると最も古い1件が自動で削除される
XADD mystream MAXLEN 100 sensor_id 1234 temperature 25.5

  • “: IDをRedisに自動発行させるおまじない。
  • `MAXLEN 100`: これが今回の主役。常に最新の状態を保つための「防波堤」だ。

3. XTRIM:溜まったゴミを力技で掃除する

もし、すでに膨大なデータが溜まってしまった後に「あ、これじゃメモリが足りない!」と気づいたらどうする?

そんな時は `XTRIM` コマンドの出番だ。これは「今すぐこのストリームを整理しろ!」と命令するコマンドだ。

今すぐ、このストリームを最新の1000件だけに絞り込め!
XTRIM mystream MAXLEN 1000

これを実行した瞬間、Redisは裏側で猛烈な勢いで古いデータを削除し、メモリを解放してくれる。君が寝ている間も、このコマンドを定期的に実行する仕組み(cronなど)を作っておけば、Redisは常にスリムで健康な状態を保てるというわけだ。

4. 知っておくべき「賢い節約術」:~(チルダ)の魔法

実は、`MAXLEN` や `XTRIM` には、もう一つ高度なテクニックがある。それが `~` (チルダ)記号だ。

MAXLEN ~ 1000
XADD mystream MAXLEN ~ 1000 data “hello”

なぜわざわざ `~` をつけるのか?
実は、Redisが厳密に「1000件」を守ろうとすると、削除のたびにメモリ内の構造を細かく調整する必要があり、これが意外とCPUの負担になる。

`~` をつけると、「だいたい1000件くらいで、いい感じにまとめて消してね」という指示になる。Redisはメモリの区切りが良いところで一気に削除を行うため、パフォーマンスが劇的に向上するんだ。「厳密さよりも、サーバー全体の軽快さを選ぶ」。これがベテランエンジニアの判断基準だ。

—

まとめ:ここをクリアすれば、もう怖くない

今日のポイントはこれだけだ。

1. メモリは有限である: 際限なくデータを追加してはいけない。
2. MAXLENで防波堤を作る: 書き込みの時点で制限をかけるのがベストプラクティス。
3. XTRIMで後から整理: 溜まってしまったら迷わず掃除する。
4. `~` でパフォーマンスを稼ぐ: 厳密さが不要なら、Redisに「お任せ」して負荷を減らす。

RedisのStreamは、単なるデータ置き場ではなく、アプリケーションのライフサイクルを制御する重要なコンポーネントだ。この「整理整頓」の概念さえ掴んでしまえば、どんなに大量のデータが押し寄せても、君のRedisサーバーは涼しい顔をして動き続けるはずだ。

さあ、次は実際に自分の手で `XADD` を叩いて、データが溢れる様子を観察してみるといい。理論を体感に変える。それが、一流エンジニアへの一番の近道だよ。

また何か疑問があればいつでも聞きに来てくれ。君の成長を楽しみにしている。

コメント

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