第6章 — Redis: キャッシュの主力エンジン
なぜ Redis か
「キャッシュの保存先として最も広く使われているのが Redis だ」とケンジ。「インメモリだから速く、データ構造が豊富で、レプリケーションもできる」
Redis のデータ構造
Redis は単なる Key-Value ストアではない。豊富なデータ構造を持つ。
| データ構造 | 用途 | コマンド例 |
|---|---|---|
| String | 単純な値、カウンター | SET, GET, INCR |
| Hash | オブジェクトの格納 | HSET, HGET, HGETALL |
| List | キュー、最新N件 | LPUSH, RPOP, LRANGE |
| Set | ユニーク集合、タグ | SADD, SMEMBERS, SINTER |
| Sorted Set | ランキング、スコア | ZADD, ZRANGE, ZRANK |
キャッシュでの活用例
# String: 単純なオブジェクトキャッシュ
redis.set("product:123", product.to_json, ex: 3600)
# Hash: オブジェクトのフィールド別アクセス
redis.hset("product:123", "name", "有機野菜セット")
redis.hset("product:123", "price", 2980)
redis.hget("product:123", "price") # => "2980"
# Sorted Set: 人気商品ランキング
redis.zincrby("popular_products", 1, "product:123")
redis.zrevrange("popular_products", 0, 9) # Top 10永続化戦略
Redis はインメモリだが、データを永続化できる。
Loading diagram...
| 方式 | 復元精度 | パフォーマンス影響 | 用途 |
|---|---|---|---|
| RDB | 最後のスナップショットまで | 低い | キャッシュ用途 |
| AOF | ほぼ完全 | 中程度 | セッション、キュー |
| RDB + AOF | 完全 | 高い | 重要データ |
INFO
キャッシュ専用なら永続化は不要。Redis が再起動しても、キャッシュミス時にDBから再取得すればよい。永続化はセッションストアやキューに使う場合に設定する。
AWS ElastiCache
本番環境では Redis を自前で運用せず、AWS の ElastiCache for Redis を使う。
| 機能 | ElastiCache |
|---|---|
| 自動フェイルオーバー | マルチ AZ 配置で自動切り替え |
| バックアップ | 日次自動スナップショット |
| スケーリング | オンラインでノード追加 |
| 暗号化 | 転送時(TLS)+ 保存時暗号化 |
| 認証 | Redis AUTH + IAM 認証 |
# config/environments/production.rb
config.cache_store = :redis_cache_store, {
url: ENV["ELASTICACHE_URL"], # rediss:// for TLS
expires_in: 1.hour,
namespace: "freshmarket",
error_handler: -> (method:, returning:, exception:) {
Rails.logger.error("ElastiCache error: #{exception}")
Sentry.capture_exception(exception)
}
}INFO
ElastiCache のエンドポイントは rediss://(TLS)を使う。redis:// ではなく二重 s。VPC 内のプライベートサブネットに配置し、セキュリティグループでアプリサーバーのみ接続を許可する。
レプリケーション
Loading diagram...
読み取りをレプリカに分散し、プライマリの負荷を軽減する。ElastiCache ではマルチ AZ 配置で自動フェイルオーバーが可能。
Redis Cluster
Loading diagram...
16,384 個のハッシュスロットにキーを分散。自動フェイルオーバーで高可用性を実現。
運用のベストプラクティス
メモリ管理
# redis.conf
maxmemory 4gb
maxmemory-policy allkeys-lfu
キー命名規約
# 推奨: コロン区切りの階層構造
product:123:detail
user:456:session
cache:api:products:page:1
危険なコマンドを禁止
# redis.conf — 本番で KEYS コマンドを禁止
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
WARNING
KEYS * は全キーをスキャンし、大規模環境ではサーバーを数秒間ブロックする。本番では必ず SCAN を使う。
マナミの Redis 構成
FreshMarket の Redis 構成:
- マスター 1台 + レプリカ 2台
- メモリ: マスター 4GB、レプリカ各 4GB
- エビクション:
allkeys-lfu - 永続化: なし(純粋なキャッシュ用途)
- TTL: 商品データ 1時間、セッション 24時間
Loading chart...
導入後のキャッシュヒット率は平均 92%。DB へのクエリ数が 10分の1 に減少した。
次の章では、DB 自体のクエリキャッシュについて学ぶ。