Redis Glossary
Redis のコアコンセプトと用語リファレンス。
Cheat Sheet

Use Cases Cheat Sheet

データ型
Keys
- Key 名は最大 512MB まで可能
- Keys は binary safe で、バイトのシーケンスで構成されるため、任意のバイト値を使用可能
有効期限の設定:
| 有効期限を設定 | 有効期限を確認 | 有効期限を削除 |
|---|---|---|
EXPIRE | PTTL | PERSIST |
EXPIREAT | TTL | |
PEXPIRE | ||
PEXPIREAT |
その他のコマンド:EXISTS、TYPE
Strings
- 文字列、数値、シリアライズされた JSON、バイナリデータを保存可能(最大 512MB)
EXPIREと組み合わせてキャッシュによく使用- 数値操作をサポート
- コマンド実行前にエンコーディングを検証
主なコマンド: SET, GET, INCR, INCRBY, INCRBYFLOAT, DECRBY
Hashes
類似:
- Java HashMap
- Python Dict
- JSON Object
特徴:
- ミュータブル(変更可能)
- 単層構造:Hash 内に List、Set、その他の構造を埋め込むことはできない
主なコマンド: HSET, HDEL, HGET, HGETALL, HINCRBY, HINCRBYFLOAT, HSCAN, HEXISTS
Lists
類似:
- Java ArrayList
- JavaScript Array
- Python list
主なコマンド: RPUSH, LPUSH, LRANGE, LPOP, RPOP
Sets
順序なしで重複のない文字列のコレクション。
主なコマンド: SADD, SMEMBERS, SISMEMBER, SINTER, SUNION
Sorted Sets
スコア付きの順序付きコレクション、スコア順にソート。
主なコマンド: ZADD, ZRANGE, ZRANK, ZSCORE
キャッシュ(Cache)
ホットデータのキャッシュ戦略:
2つの方式:
- 読み取り前に Redis を確認、データがなければ DB から読み取り Redis に保存
- データ挿入時に同時に Redis に書き込み
sequenceDiagram
participant Ws as Webserver
box Cache Layer
participant R as Redis
end
participant Db as Database
Ws ->> R: Request
alt Data Exist
R -->> Ws: Response Data
else Data Not Exist
R ->> Db: Get Data
Db ->> R: Response Data
R ->> Ws: Response Data
end
キャッシュの問題
Penetration(穿透)
クライアントがリクエストしたデータが Cache にも Database にも存在せず、毎回のリクエストが Cache を通過してデータベースに直接到達する。
Hotspot Invalid / Cache Stampede(擊穿)
人気のある Cache key が期限切れになり、高い同時アクセスがこの key に集中すると、トラフィックが直接データベースに到達する。
Avalanche(雪崩)
ある時点で大量のキャッシュデータが同時に期限切れ(TTL Expired)になり、後続のクエリがすべてバックエンドデータベースにリクエストされ、システム過負荷を引き起こす可能性がある。
Pollution(汚染)
不適切または無効なデータがキャッシュに入り、キャッシュデータが不正確または使用不能になる。
Consistency(一貫性)
キャッシュとデータベースのデータが一致しない。通常、データ更新時にキャッシュへの同期が間に合わないことが原因。
Breakdown(障害)
Redis キャッシュサービスが障害を起こすと、バックエンドデータベースがすべてのトラフィックを受け、過大な負荷がかかる。
永続化(Persistence)
- RDB(Redis Database Backup file):データスナップショットファイルを生成
- AOF(Append Only File):リアルタイムでコマンドを追記するログファイル
flowchart LR
R[Redis]
PS[Persistent Storage-Entire Dataset]
R -->|AOF, Snapshot| PS
Snapshot
トリガー方法:
- 手動(Manually)
- 自動(Auto)
再起動時間が長すぎると実用的ではない。代替案:Replication(Cluster + Sentinel)
AOF(Append-Only File)
各書き込み操作をリアルタイムで記録し、ログを再生してデータを復元できる。
分散ロック(Distributed Lock)
従来のデータベースロック機構については、Database Locks を参照してください。
SETNX(SET if Not Exists)を使用して基本的な分散ロックを実装:
flowchart TD
C1[Client1]
K{{setnx-lockKey,123456xyz,TTL}}
WnRL[Wait and Retry Later]
Dwork([Do some work on the shared resource])
dK([del-localkey])
C([Complete])
C1 -->K
K -->|True: 0, failed to acquire lock| WnRL
K -->|True: 1, acquired the lock| Dwork
Dwork --> dK
dK --> C
完全なフォールトトレラントサポートライブラリ:
- Java: Redisson
Redis Set Lock vs Redisson Lock
実装レベルの比較
| 実装レベル | Redis Set Lock | Redisson Lock |
|---|---|---|
| 基本コマンド | SET key value NX EX ttl | Lua スクリプト + 複数の Redis コマンド |
| 原子性保証 | Redis ネイティブ単一コマンド原子性 | Lua スクリプト実行原子性 |
| ネットワーク往復 | 1回 | 1回(スクリプトは複雑) |
| Redis 負荷 | 非常に軽量 | 中程度(スクリプト実行) |
| ストレージ構造 | シンプルな key-value | Hash 構造 + メタデータ |
機能特性の比較
| 機能項目 | Redis Set Lock | Redisson Lock |
|---|---|---|
| 基本排他ロック | ✅ 完全サポート | ✅ 完全サポート |
| リエントラントロック | ❌ 非サポート | ✅ サポート(カウント機構) |
| 自動更新 | ❌ 固定 TTL | ✅ Watchdog 機構 |
| 公平ロック | ❌ 非サポート | ✅ サポート |
| 読み書きロック | ❌ 非サポート | ✅ サポート |
| 条件待機 | ❌ 非サポート | ✅ サポート |
| マルチロック | ❌ 非サポート | ✅ サポート |
| ロック監視 | ❌ 基本監視 | ✅ 豊富な監視 |
判断基準
| ビジネス特性 | 推奨方案 |
|---|---|
| タスク実行時間 < 15分 | Redis Set Lock |
| タスク実行時間 > 30分 | Redisson Lock |
| 高並行 + 低レイテンシ要件 | Redis Set Lock |
| リエントラントロックが必要 | Redisson Lock |
| マイクロサービス軽量化 | Redis Set Lock |
| エンタープライズ級複雑アプリ | Redisson Lock |
Redisson Lock Types
基本ロックタイプ
| ロックタイプ | インターフェース | リエントラント | 公平性 | 適用シーン |
|---|---|---|---|---|
| リエントラントロック | RLock | ✅ サポート | ❌ 非公平 | 一般的な排他シーン |
| 公平ロック | RFairLock | ✅ サポート | ✅ 公平 | 順序処理が必要 |
| 読み書きロック | RReadWriteLock | ✅ サポート | ❌ 非公平 | 読み多い書き少ない |
| マルチロック | RMultiLock | ✅ サポート | ❌ 非公平 | 複数リソース同時ロック |
| 赤ロック | RRedLock | ✅ サポート | ❌ 非公平 | 複数 Redis インスタンス高可用 |
同期ツールタイプ
| ツールタイプ | インターフェース | 用途 | 適用シーン |
|---|---|---|---|
| セマフォ | RSemaphore | 並行数制御 | レート制限、リソースプール |
| 期限付きセマフォ | RPermitExpirableSemaphore | TTL 付きセマフォ | 一時リソース割り当て |
| カウントダウンラッチ | RCountDownLatch | 複数タスク完了待機 | バッチタスク協調 |
選択基準
| 要件特性 | 推奨選択 |
|---|---|
| 一般排他 + 高性能 | RLock |
| 公平性が必要 | RFairLock |
| 読み書き分離 | RReadWriteLock |
| 複数リソース原子操作 | RMultiLock |
| 極めて高い可用性要件 | RRedLock |
| 並行数制御 | RSemaphore |
| タスク同期待機 | RCountDownLatch |
性能優先度: RLock > RReadWriteLock > RSemaphore > RFairLock > RMultiLock > RRedLock
ユースケース
Rate Limiter(レート制限)
User ID / Device ID / Token / API Key に基づいてレート制限:
sequenceDiagram
participant U1 as User1
box Webservers
participant WsA as Webserver_A
end
box Cache
participant R as Redis
end
participant Db as Database
U1 -->> WsA: Requests
WsA -->> R: Requests
alt within rate_limit
R ->> Db: Allow Access
Db ->> R: Response
R ->> WsA: Response
WsA ->> U1: Response
else over rate_limit
R -->> Db: ❌
end
Delay Queue(遅延キュー)
遅延操作、Ack 確認機構なし。
適用シーン:
- ECサイトで注文後、一定時間内に支払いがなければ注文自動キャンセル
- 配車サービスで一定時間内にドライバーが受注しなければキャンセル
- フードデリバリーで店舗が一定時間内に受注しなければ自動キャンセル
Session Store
ステートレスサーバー間でセッションデータを共有:
flowchart LR
U1[User1]
U2[User2]
subgraph WebServers
WsA[Webserver_A]
WsB[Webserver_B]
end
subgraph box
R[Redis]
end
U1 -->|Request| WsA
U2 -->|Request| WsB
WebServers -->|Store Session Data| R
WsA -->|Cookie-Unique Session ID| U1
WsB -->|Cookie-Unique Session ID| U2
その他のアプリケーション
| 適用シーン | 使用方法 |
|---|---|
| Game Ranking / Leaderboard | Sorted Sets |
| Counter(カウンター) | INCR, INCRBY(アトミック操作) |
| 期限付きビジネス | TTL 有効期限機構 |
| いいね、友達などの関係保存 | Sets |