Redis Glossary
Redis 核心概念與術語參考。
Cheat Sheet

Use Cases Cheat Sheet

資料類型
Keys
- Key 名稱最大可達 512MB
- Keys 是 binary safe,由一序列 bytes 組成,因此可使用任何 byte 值
過期時間設定:
| 設定過期時間 | 查詢過期時間 | 移除過期時間 |
|---|---|---|
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
特性:
- 可變(Mutable)
- 單層結構:無法在 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)
熱點數據的緩存策略:
兩種方式:
- 讀取前先查 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(穿透)
Client 請求的資料不存在於 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 確認機制。
應用場景:
- 購物平台下單後超時未付款,訂單自動取消
- 叫車服務超時無車主接單,平台取消訂單
- 外送訂單商家超時未接單,自動取消
Session Store
在無狀態伺服器之間共享 Session 資料:
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 |