首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

RDBMS 資料表與 Redis 模型映射設計指南

     編輯:DB2 教學

RDBMS 資料表與 Redis 模型映射設計指南

Redis 是高效能 Key-Value 記憶體資料庫,缺乏 RDBMS 的表、索引、外鍵等概念。若要在 Redis 中實現關聯式資料模型的存取模式,必須建立一套系統化的映射規則。本文整理一套基於「非業務含義數值序列為主鍵」前提的映射方案,適用於以 Redis 為快取或主存儲的架構設計。

一、核心設計原則

  • 主鍵策略:使用數值序列(如 INCR 生成)作為主鍵,節省記憶體
  • 應用層維護:所有 Key-Value 的建立、維護、索引同步、唯一性檢查均由應用程式負責,Redis 僅負責儲存
  • Key 命名規範:表名:子結構:標識 格式,確保鍵值空間隔離與可讀性

二、基礎表模型映射

RDBMS 概念Redis Key 規則Redis 類型Value 結構說明
主鍵序列表名:idSTRING整數字串新增記錄前 INCR 取得下一個主鍵值
主表記錄表名:主鍵值HASH{欄位:值, ...}除主鍵外所有欄位,Key 不含主鍵欄位

範例:emp 表

-- 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 表於 mgr_id 建非唯一索引

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 表於 email 建唯一索引

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:值2SET主鍵集合
唯一組合索引表名:uniques:uniq欄1欄2HASH{值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));

七、刪除與更新時的索引同步

  • 刪除:先讀取記錄取得索引欄值 → 從對應 SET/HASH 移除主鍵 → 刪除主表 HASH
  • 更新索引欄:視為「舊值刪除 + 新值新增」兩步驟,需在事務或 Lua 腳本中保證原子性

八、優缺點與適用場景

優點缺點/注意事項
極高讀寫效能,適合高併發熱點資料應用層複雜度大幅上升,需自行維護索引一致性
彈性資料結構,適合半結構化資料無原生關聯查詢,複雜 JOIN 需應用層組裝
記憶體存取,延遲微秒級資料量受限於記憶體,需規劃淘汰策略與持久化

適用場景:高併發讀寫、Session 快取、排行榜、計數器、簡單 CRUD 為主的微服務資料層


結語:RDBMS 到 Redis 的映射本質是「將關聯模型拆解為多個 Key-Value 結構,由應用層承擔索引維護責任」。掌握上述命名規範與同步邏輯,可作為自研 ORM 或快取層設計的藍圖。實務中亦可考慮 Redisson、Spring Data Redis 等成熟框架降低開發負擔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved