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 のデータを格納すると、ネットワーク帯域とレイテンシに影響する
関連書籍も参考になる。