Redis は『万能サーバー』ではなく『5つの専門家』
Redis はキー/バリュー以外にも多彩な用途があり、適切に使い分ければアプリの体感速度と堅牢性が大幅に上がります。本記事では編集部の視点で主要ユースケースを公開情報をもとに整理します。PostgreSQL 実践 もご参考に。
1. キャッシュとして使う
(1) TTL を必ず設定:永続化はキャッシュではない。(2) cache-aside パターン:DB→キャッシュへ書き込み。(3) write-through:書き込み時に同時更新。(4) キャッシュ無効化:書き込み時に DEL。(5) thundering herd:単一ロックで再生成衝突回避。
2. セッションストア
(1) ステートレスAPIのセッション保持。(2) TTL でログアウト:30分等。(3) マルチサーバー対応:sticky session 不要。(4) セッションID は推測困難に:暗号学的乱数。(5) 大容量セッション NG:1KB以下が目安。認証・認可実践 も合わせて。
3. 分散ロック (Redlock)
(1) SET key value NX PX timeout:原子的ロック取得。(2) 解放は Lua スクリプト:自分のロックだけ削除。(3) 有効期限必須:デッドロック防止。(4) Redlock アルゴリズム:複数ノードで多数派ロック。(5) 厳密な相互排他は別手段:DBの SELECT FOR UPDATE 等併用。
4. Pub/Sub と Stream
(1) Pub/Sub:購読者へリアルタイム配信、配信失敗は再送なし。(2) Stream (XADD/XREAD):永続的なログ、コンシューマグループ対応。(3) 軽量メッセージング:Kafka より導入容易。(4) 永続性が必要なら Stream。(5) 大量・高信頼性は Kafka へ。キューシステム設計 もご参考に。
5. レート制限・カウンタ
(1) INCR + EXPIRE:簡易レート制限。(2) HyperLogLog (PFADD):ユニーク数を低メモリで概算。(3) Sorted Set:ランキング・最新N件。(4) Bitmap:日別アクティブユーザー判定。(5) 分散環境で正確:単一の真実源として機能。
運用の注意点
(1) メモリ管理:maxmemory + maxmemory-policy 設定必須。(2) 永続化:RDB / AOF の選択。(3) クラスタモード:シャーディングとフェイルオーバー。(4) クライアントのコネクション管理:プール推奨。(5) 監視:mem usage / evicted_keys / slow log。マネージドなら ElastiCache / Memorystore / Upstash / Redis Cloud が選択肢。
失敗しがちなパターン
(1) TTL 未設定で永続化:メモリ圧迫。(2) KEYS * を本番で実行:全停止級。(3) 巨大な値を保存:1キー数MBで遅延。(4) シングルポイント:HA未構成。(5) Pub/Sub で永続性期待。対策は、(1)TTL徹底、(2)SCAN 使用、(3)サイズ上限、(4)HA構成、(5)Stream/外部キュー併用、です。