Redis Pub/SubとRedis Streamsの違いとユースケース別選定指針

Redis Database Architecture Backend
結論

使い捨て通知は Pub/Sub、永続化・再処理が必要なら StreamsMAXLEN 必須)を選択します。

# Redis公式仕様:Streams へのメッセージ追加と自動トリミング(OOM防止)
# MAXLEN ~ 10000 でメモリ上限を約1万件に抑えつつ高速処理
XADD mystream MAXLEN ~ 10000 * sensor-id 123 temperature 19.8

Redis公式仕様:機能比較マトリクス

評価項目Redis Pub/SubRedis 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クラッシュを起こす障害 が発生します。


適切な選定・運用手順

  1. 切断時のメッセージ再送や失敗ログのリカバリが不要なチャットUI更新には Pub/SubPUBLISH mychannel "msg")を採用する
  2. メッセージの確実な処理やタスクキュー構築には Redis Streams を使用する
  3. Streams 使用時は XADD mystream MAXLEN ~ 10000 * key val のように近似トリミング(~)を付与してパフォーマンスを維持しながら OOM を防止する