Redisメモリ枯渇時のKey Evictionポリシー(LRU・LFU)選定基準

Redis Database Performance DevOps
結論

純粋なキャッシュ用途では maxmemory-policy allkeys-lru を設定して OOM エラーを防ぎます。

# Redis公式仕様:redis.conf でのメモリ制御設定
maxmemory 2gb
maxmemory-policy allkeys-lru

Redis公式仕様:Key Eviction ポリシー比較マトリクス

Redis公式ドキュメント(redis.io/docs/reference/eviction/)で定義されている主要なメモリ追い出しアルゴリズムの比較です。

ポリシー名削除対象キー選択アルゴリズム事故リスクと注意点
allkeys-lru全キーLRU(最も長く参照されていない)◯ Webキャッシュのデファクト標準
allkeys-lfu全キーLFU(最も参照頻度が少ない)頻出ヒットアイテムを強力に残したい場合
volatile-lruTTL設定済みキーのみLRUTTL設定漏れキーがあると OOM 発生
noeviction削除しないなし(エラー返却)maxmemory 超過で書き込み全停止

実際に起こる障害:OOM command not allowed による書き込み全滅事故

設定の落とし穴として、デフォルトの noeviction(または TTL未設定状態での volatile-lru)のまま運用し、Redisのメモリが maxmemory 上限に達した際、新しい SETINCR コマンドが以下のエラーを返して完全に停止する障害 が発生します。

(error) OOM command not allowed when used memory > 'maxmemory'

これにより、セッションストアやキャッシュ書き込みを呼び出している Web アプリケーション全体が 500 エラーを返して落ちてしまいます。


設定の手順

  1. redis.conf または CONFIG SET でサーバーの安全なメモリ上限(例: maxmemory 2gb)を指定する
  2. 純粋なキャッシュ用途(キーが消えてもDBから再取得可能)であれば maxmemory-policy allkeys-lru を設定する
  3. INFO stats コマンドを定期実行し、evicted_keys(追い出されたキー数)の推移を監視する