05
第 5 章

キー設計とメモリ管理

この章で学ぶこと
1キー命名規則と設計パターン
2TTL 戦略とキャッシュスタンピードの回避
3メモリ管理とキー削除ポリシーの選択
4運用のベストプラクティスとアンチパターン
解説

セクション導入 — 前提の確認

データ構造
String / Hash / List / Set / Sorted Set / Stream
TTL
キーに有効期限を設定する仕組み
インメモリ
すべてのデータがメモリ上に存在する
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

RDB のテーブル設計との違い

RDB
テーブル定義が先、アプリがそれに合わせる
Redis
アクセスパターンが先、キーをそれに合わせる
「どうやってデータを取得するか」から逆算して設計する
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
図解

RDB と Redis の設計アプローチの違い

RDB はスキーマ起点、Redis はアクセスパターン起点
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
コマンド

コロン区切りの名前空間

{サービス}:{エンティティ}:{ID}
user:1001:profileユーザーのプロフィール情報
user:1001:sessionユーザーのセッション情報
cache:api:users:listAPI キャッシュ
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

キー設計の実例

ユーザー情報
user:{id}:profile(Hash)
セッション
session:{session_id}(Hash + TTL)
ランキング
ranking:daily(Sorted Set)
カウンタ
counter:page:{page_id}:views(String)
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
実演

キー設計の確認

目的コロン区切りのキーを作成し、パターンで検索する
操作HSET / HGETALL / キーの一覧確認
確認する
ポイント
命名規則に沿ったキーの構造
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

SCAN コマンドの役割

KEYS
全キーを一括取得(ブロッキング)
SCAN
カーソルベースで段階的に取得(ノンブロッキング)
本番環境では SCAN を使う
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
コマンド

SCAN コマンドの使い方

$ SCAN cursor [MATCH pattern] [COUNT hint]
cursor走査開始位置(最初は 0)
MATCH patternキー名のフィルタパターン
COUNT hint1 回で走査する件数の目安(デフォルト 10)
戻り値[次のカーソル, キーのリスト]
カーソルが 0 に戻ったら走査完了
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
実演

SCAN の動作確認

目的SCAN でキーを段階的に走査する
実行する
コマンド
$ SCAN 0 MATCH product:* COUNT 100
確認する
ポイント
カーソルの変化と返されるキー
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

TTL を設定すべきキーの判断基準

TTL を設定すべきキー
キャッシュ、セッション、一時的なロック
TTL を設定しないキー
マスターデータ、設定情報
判断基準: そのデータに「自然な有効期限」があるか
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

キャッシュスタンピードとは

キャッシュスタンピード
大量のキーが同時に期限切れになり、一斉にDBへアクセスが集中する現象
別名: サンダリングハード(Thundering Herd)
原因: 同じ TTL を設定したキーが同時に失効する
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
図解

キャッシュスタンピードの発生メカニズム

同一 TTL の一斉失効とジッターによる分散
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

TTL のジッター

ジッター(Jitter)
TTL にランダムなばらつきを加える手法
基本の TTL ± ランダム値
例: 3600 秒 ± 300 秒(3300〜3900 秒の範囲)
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
実演

ジッターつき TTL の設定

目的ジッターを加えた TTL を設定し、ばらつきを確認する
実行する
コマンド
$ SET cache:product:1 "data1"$ EXPIRE cache:product:1 3450
確認する
ポイント
各キーの TTL 値が異なること
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

maxmemory の役割

maxmemory
Redis が使用できるメモリの上限値
設定しないと物理メモリを使い切る可能性がある
上限に達したとき、キー削除ポリシーに従って動作する
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

キー削除ポリシーの概念

キー削除ポリシー(maxmemory-policy)
メモリ上限到達時にどのキーを削除するかの方針
Redis がメモリを確保するために自動的にキーを削除する
英語では eviction policy と呼ばれる
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
コマンド

INFO memory によるメモリ確認

$ INFO memory
used_memory_human使用中のメモリ量
maxmemory_human設定された上限値
maxmemory_policy現在のキー削除ポリシー
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
実演

INFO memory の確認

目的INFO memory でメモリ使用量とポリシーを確認する
実行する
コマンド
$ INFO memory
確認する
ポイント
used_memory、maxmemory、maxmemory_policy の値
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
図解

キー削除ポリシーの一覧

ポリシー
対象
削除基準
主な用途
noeviction
削除しない
データ損失不可
allkeys-lru
全キー
最近未使用順
汎用キャッシュ
allkeys-lfu
全キー
低頻度順
偏りあるアクセス
volatile-lru
TTL 付き
最近未使用順
混在環境
volatile-lfu
TTL 付き
低頻度順
TTL 付き頻度
volatile-ttl
TTL 付き
残 TTL 短い順
期限優先削除
allkeys-random
全キー
ランダム
均等アクセス
volatile-random
TTL 付き
ランダム
TTL 付きランダム
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
図解

キー削除ポリシーの選択フロー

用途に応じたポリシー選択のフローチャート
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

ポリシー選択の判断基準

全キーがキャッシュ
allkeys-lru または allkeys-lfu
キャッシュ + 永続データが混在
volatile-lru
データ損失を許容しない
noeviction(メモリ監視が必須)
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

Big Key の問題

Big Key
1 つのキーに大量のデータが格納された状態
削除時に Redis がブロックされる
メモリの断片化・ネットワーク帯域の圧迫
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

Big Key の回避策

分割
大きなデータを複数のキーに分ける
UNLINK
DEL の代わりに非同期で削除する
監視
redis-cli --bigkeys で検出する
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
注意

KEYS コマンドの危険性

KEYS
パターン一致する全キーを一括取得
問題: O(N) でブロッキング
キー数が多いと Redis が応答不能になる
対策: 本番では SCAN を使う
KEYS は開発環境のみ
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

ホットキー問題

ホットキー
特定のキーにアクセスが集中する状態
問題点
単一キーがボトルネックになりパフォーマンスが低下
対処法
キーの分散、レプリカの読み取り分散
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

パイプライン

パイプライン
複数コマンドをまとめて送信し、ラウンドトリップを削減
通常
コマンドごとに送信→応答を待つ
パイプライン
まとめて送信→まとめて応答を受け取る
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
図解

通常の実行とパイプラインの比較

コマンドごとの往復 vs まとめて送受信
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
解説

OBJECT ENCODING

OBJECT ENCODING
キーの内部エンコーディングを確認するコマンド
小さなデータはメモリ効率の良い形式で自動格納
listpack 等
データが大きくなると通常の形式に自動変換される
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ
まとめ

この章のまとめ

コロン区切りの名前空間でキーを設計する
本番でのキー走査は SCAN を使う
TTL にジッターを加えてキャッシュスタンピードを防ぐ
用途に応じたキー削除ポリシーを選択する
Big Key は分割・UNLINK・監視で回避する
KEYS は本番で使わない、ホットキーを避ける
次章: 永続化
キー設計
SCAN
TTL 戦略
メモリ管理
削除ポリシー
Big Key
運用の注意点
まとめ