Redis Pub/SubとRedis Streamsの違いとユースケース別選定指針
Redis Database Architecture Backend
結論
使い捨て通知は Pub/Sub、永続化・再処理が必要なら Streams(MAXLEN 必須)を選択します。
# Redis公式仕様:Streams へのメッセージ追加と自動トリミング(OOM防止)
# MAXLEN ~ 10000 でメモリ上限を約1万件に抑えつつ高速処理
XADD mystream MAXLEN ~ 10000 * sensor-id 123 temperature 19.8
Redis公式仕様:機能比較マトリクス
| 評価項目 | Redis Pub/Sub | Redis Streams |
|---|---|---|
| メッセージの永続化 | ❌ 一切保存されない(Fire-and-Forget) | ◯ ディスク/RAM上に永続保存 |
| オフラインクライアント | ❌ 受信不可(切断中のメッセージは消滅) | ◯ 復帰後に過去ログを読み直し可能 |
| 配達保証 | At-most-once(最高1回、未達あり) | At-least-once(Ack確認・再送保証) |
| コンシューマーグループ | ❌ 全サブスクライバーへ同報放送のみ | ◯ ワーカー間での負荷分散と未処理管理 |
実際に起こる障害:XTRIM 指定漏れによる Redis の OOM (メモリ枯渇) クラッシュ
Redis Streams は Pub/Sub と異なり、送信されたメッセージをログとしてメモリ上に蓄積し続けます。
XADD コマンドでメッセージを追加する際、MAXLEN オプションや定期的な XTRIM コマンドを設定していない場合、メッセージの増加に伴って Redis のメモリ(RAM)が限界まで膨れ上がり、OOM command not allowed エラーを発生させて書き込み不可・DBクラッシュを起こす障害 が発生します。
適切な選定・運用手順
- 切断時のメッセージ再送や失敗ログのリカバリが不要なチャットUI更新には
Pub/Sub(PUBLISH mychannel "msg")を採用する - メッセージの確実な処理やタスクキュー構築には
Redis Streamsを使用する - Streams 使用時は
XADD mystream MAXLEN ~ 10000 * key valのように近似トリミング(~)を付与してパフォーマンスを維持しながら OOM を防止する