Redis 是高效能 Key-Value 記憶體資料庫,缺乏 RDBMS 的表、索引、外鍵等概念。若要在 Redis 中實現關聯式資料模型的存取模式,必須建立一套系統化的映射規則。本文整理一套基於「非業務含義數值序列為主鍵」前提的映射方案,適用於以 Redis 為快取或主存儲的架構設計。
INCR 生成)作為主鍵,節省記憶體表名:子結構:標識 格式,確保鍵值空間隔離與可讀性| RDBMS 概念 | Redis Key 規則 | Redis 類型 | Value 結構 | 說明 |
|---|---|---|---|---|
| 主鍵序列 | 表名:id | STRING | 整數字串 | 新增記錄前 INCR 取得下一個主鍵值 |
| 主表記錄 | 表名:主鍵值 | HASH | {欄位:值, ...} | 除主鍵外所有欄位,Key 不含主鍵欄位 |
-- RDBMS
emp_id | ename | mgr_id
-------|----------|-------
1 | SMITH | 8
2 | ALLEN | 8
3 | SALESMAN | 7
-- Redis
emp:id → "3"
emp:1 → { ename="SMITH", mgr_id="8" }
emp:2 → { ename="ALLEN", mgr_id="8" }
emp:3 → { ename="SALESMAN", mgr_id="7" }
| RDBMS 概念 | Redis Key 規則 | Redis 類型 | Value 結構 |
|---|---|---|---|
| 非唯一索引欄 | 表名:indices:索引欄名:索引值 | SET | 符合該索引值的所有主鍵集合 |
emp:indices:mgr_id:7 → { "3" }
emp:indices:mgr_id:8 → { "1", "2" }
查詢流程:SMEMBERS emp:indices:mgr_id:8 取得主鍵集合 → 逐一 HGETALL emp:1 取完整記錄
| RDBMS 概念 | Redis Key 規則 | Redis 類型 | Value 結構 |
|---|---|---|---|
| 唯一索引欄 | 表名:uniques:索引欄名 | HASH | {索引值:主鍵值, ...} |
emp:uniques:email → { "foo@gmail.com":"1", "bar@163.com":"2", "zoo@hotmail.com":"3" }
唯一性檢查:寫入前 HEXISTS emp:uniques:email "new@mail.com",存在即衝突
組合索引將多欄值序列化為單一 Key 片段,常用分隔符(如 : 或 |)連接:
| 索引類型 | Key 規則 | 類型 | Value |
|---|---|---|---|
| 非唯一組合索引 | 表名:indices:idx欄1欄2:值1:值2 | SET | 主鍵集合 |
| 唯一組合索引 | 表名:uniques:uniq欄1欄2 | HASH | {值1:值2:主鍵} |
// 1. 取得下一個主鍵
long id = redis.incr("emp:id");
// 2. 寫入主表記錄
redis.hset("emp:" + id, "ename", "NEW");
redis.hset("emp:" + id, "mgr_id", "8");
// 3. 維護非唯一索引 mgr_id
redis.sadd("emp:indices:mgr_id:8", String.valueOf(id));
// 4. 維護唯一索引 email (假設 email="new@test.com")
if (redis.hexists("emp:uniques:email", "new@test.com")) throw new DuplicateKeyException();
redis.hset("emp:uniques:email", "new@test.com", String.valueOf(id));
| 優點 | 缺點/注意事項 |
|---|---|
| 極高讀寫效能,適合高併發熱點資料 | 應用層複雜度大幅上升,需自行維護索引一致性 |
| 彈性資料結構,適合半結構化資料 | 無原生關聯查詢,複雜 JOIN 需應用層組裝 |
| 記憶體存取,延遲微秒級 | 資料量受限於記憶體,需規劃淘汰策略與持久化 |
適用場景:高併發讀寫、Session 快取、排行榜、計數器、簡單 CRUD 為主的微服務資料層
結語:RDBMS 到 Redis 的映射本質是「將關聯模型拆解為多個 Key-Value 結構,由應用層承擔索引維護責任」。掌握上述命名規範與同步邏輯,可作為自研 ORM 或快取層設計的藍圖。實務中亦可考慮 Redisson、Spring Data Redis 等成熟框架降低開發負擔。