Redis Glossary

Redis 核心概念與術語參考。

Cheat Sheet

Redis Cheat Sheet

Use Cases Cheat Sheet

Redis Use Cases Cheat Sheet

資料類型

Keys

  • Key 名稱最大可達 512MB
  • Keys 是 binary safe,由一序列 bytes 組成,因此可使用任何 byte 值

過期時間設定:

設定過期時間查詢過期時間移除過期時間
EXPIREPTTLPERSIST
EXPIREATTTL
PEXPIRE
PEXPIREAT

其他指令:EXISTSTYPE

Strings

  1. 可儲存字串、數值、序列化 JSON 和二進位資料(最大 512MB)
  2. 結合 EXPIRE 常用於快取
  3. 支援數值操作
  4. 執行指令前會驗證編碼

常用指令: 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)

熱點數據的緩存策略:

兩種方式:

  1. 讀取前先查 Redis,若無資料則讀取 DB 後存入 Redis
  2. 插入資料時同時寫入 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 LockRedisson Lock
底層命令SET key value NX EX ttlLua 腳本 + 多個 Redis 命令
原子性保證Redis 原生單命令原子性Lua 腳本執行原子性
網路往返1 次1 次(但腳本複雜)
Redis 負載極輕量中等(腳本執行)
存儲結構簡單 key-valueHash 結構 + 元數據

功能特性對比

功能項目Redis Set LockRedisson 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 確認機制。

應用場景:

  1. 購物平台下單後超時未付款,訂單自動取消
  2. 叫車服務超時無車主接單,平台取消訂單
  3. 外送訂單商家超時未接單,自動取消

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 / LeaderboardSorted Sets
Counter(計數器)INCR, INCRBY(原子操作)
限時業務TTL 過期機制
讚、好友等關係存儲Sets

相關主題