mybook

第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 自体のクエリキャッシュについて学ぶ。