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-lru | TTL設定済みキーのみ | LRU | ❌ TTL設定漏れキーがあると OOM 発生 |
noeviction | 削除しない | なし(エラー返却) | ❌ maxmemory 超過で書き込み全停止 |
実際に起こる障害:OOM command not allowed による書き込み全滅事故
設定の落とし穴として、デフォルトの noeviction(または TTL未設定状態での volatile-lru)のまま運用し、Redisのメモリが maxmemory 上限に達した際、新しい SET や INCR コマンドが以下のエラーを返して完全に停止する障害 が発生します。
(error) OOM command not allowed when used memory > 'maxmemory'
これにより、セッションストアやキャッシュ書き込みを呼び出している Web アプリケーション全体が 500 エラーを返して落ちてしまいます。
設定の手順
redis.confまたはCONFIG SETでサーバーの安全なメモリ上限(例:maxmemory 2gb)を指定する- 純粋なキャッシュ用途(キーが消えてもDBから再取得可能)であれば
maxmemory-policy allkeys-lruを設定する INFO statsコマンドを定期実行し、evicted_keys(追い出されたキー数)の推移を監視する