Redis

インメモリデータストアで、キャッシュ、セッション管理、Pub/Sub に使われる

データベースキャッシュ

Redis とは

Redis (Remote Dictionary Server) は、2009 年に Salvatore Sanfilippo が開発したオープンソースのインメモリデータストアである。全データをメモリ上に保持するため、読み書きがマイクロ秒〜ミリ秒単位で完了する。AWS では ElastiCache for Redis または MemoryDB for Redis として利用できる。

データ構造

Redis の強みは、単純な Key-Value だけでなく多彩なデータ構造をネイティブにサポートする点にある。

データ構造 用途 コマンド例
String キャッシュ、カウンター SET key value / INCR counter
Hash オブジェクトの格納 HSET user:1 name "Alice"
List キュー、タイムライン LPUSH queue task1 / RPOP queue
Set ユニーク集合、タグ SADD tags "aws" / SMEMBERS tags
Sorted Set ランキング、スコアボード ZADD leaderboard 100 "player1"
Stream イベントログ、メッセージング XADD events * type "order"

キャッシュ戦略

戦略 読み取り 書き込み 整合性
Cache-Aside アプリがキャッシュを確認→ミスなら DB から取得→キャッシュに書く DB に書く→キャッシュを無効化 結果整合性
Write-Through キャッシュから読む キャッシュと DB に同時に書く 強い整合性
Write-Behind キャッシュから読む キャッシュに書く→非同期で DB に反映 結果整合性

Lambda + DynamoDB 構成では Cache-Aside が最も一般的。TTL を設定してキャッシュの鮮度を管理する。

ElastiCache vs MemoryDB

観点 ElastiCache for Redis MemoryDB for Redis
用途 キャッシュ プライマリ DB
耐久性 ベストエフォート Multi-AZ トランザクションログ
レイテンシ マイクロ秒 (読み取り) マイクロ秒 (読み取り)、ミリ秒 (書き込み)
コスト 低い 高い

キャッシュ用途なら ElastiCache、Redis をプライマリ DB として使うなら MemoryDB を選択する。

Pub/Sub

Redis の Pub/Sub はリアルタイム通知に使える。パブリッシャーがチャンネルにメッセージを送信し、サブスクライバーが受信する。ただし永続化されないため、メッセージの確実な配信が必要な場合は Redis Streams または SQS/SNS を使う。

よくある落とし穴

  • メモリ枯渇: maxmemory-policy を設定しないと、メモリが枯渇して書き込みが失敗する。allkeys-lru (LRU で自動削除) が一般的
  • ホットキー: 特定のキーにアクセスが集中すると、そのノードがボトルネックになる。キーの分散設計が重要
  • 大きな値: 1 つのキーに数 MB のデータを格納すると、ネットワーク帯域とレイテンシに影響する

関連書籍も参考になる。

関連用語