Redis 鍵名的設計
一.前言
結構化資料庫的特點在於,需要事先嚴格定義好欄位名,欄位型別,長度,預設值,取值範圍,約束條件等,而且必須保證所有記錄的所有欄位都嚴格按結構設計來儲存資料,否則不允許儲存。關係型資料庫在入庫前進行了大量的檢查和處理工作,如 SQL Server, Oracle, MySQL, PostgerSQL。
半結構化資料庫則沒有這些限制,可以較靈活地儲存資料,入庫時資料庫本身不做嚴格檢查,而是到客戶端應用程式使用時,再檢查資料的正確性和可用性,這樣可極大提高資料的讀寫效能,如 MongoDB, Hbase ,Redis。
非結構化資料無明顯的資料庫結構可言,可作為一個整體資料進行儲存,如文件,影象,音視訊等。
Redis資料庫是一個鍵值對資料庫,提供了5種基本資料型別 (String, List, Hash, Set, ZSet),利用鍵名對資料內容進行儲存和讀取。Redis的業務處理邏輯,包含在鍵值的設計中,一般是利用實際的業務資料,動態拼裝鍵名,來進行相關資料的儲存和讀取。因此客戶端應用程式需要有一個統一的鍵值設計方案,才能有效實現相應的業務邏輯。
二.鍵名設計規則
本文提供了一種對Redis鍵名(沒有包含值型別的設計)進行結構化設計的方案。鍵名的長度:可達512M, 但鍵名越長,越佔資源,需要權衡
以下提供的命名專案,中間用冒號(:)分隔,其中(2,3,4,6)項是基本的,其他專案可以根據需要進行取捨使用。
序號 |
條目 |
說明 |
舉例 |
1 |
實體族 |
也可理解為命令空間,Schema等 |
sys |
2 |
實體名 |
表名,包括系統表 |
user |
3 |
查詢欄位名 |
查詢欄位,或用於定位相關業務資訊 預設欄位可以省略不寫,如主鍵欄位 |
userid |
4 |
查詢欄位值 |
具體業務內容,跟查詢欄位名對應 |
888 |
5 |
資料值對應的列族名 |
欄位族,參考Hbase的結構設計 |
base |
6 |
資料值對應的列名 |
當前鍵要儲存的資料值對應的資料列名 即當 【查詢欄位名】= 【查詢欄位值】時, 獲得的內容對應的資料列名 |
username |
7 |
資料值的版本號 |
參考Hbase的結構設計,可保留值的多個版本資訊 |
|
8 |
資料值的時間戳 |
參考Hbase的結構設計 |
|
三.舉例說明
- 結構化資料庫的表設計:
表名: user
序號 |
欄位名 |
說明 |
1 |
userid |
使用者id |
2 |
username |
使用者名稱稱 |
3 |
userole |
使用者角色 |
4 |
password |
使用者密碼 |
5 |
isactive |
使用者是否有效 |
表名: role
序號 |
欄位名 |
說明 |
1 |
roleid |
關係型資料庫的表物理主鍵,在Redis中,若沒有引用,則可不要 |
2 |
rolename |
角色名稱,固定值為 visitor, admin |
表名:loginlog :登入歷史表
序號 |
欄位名 |
說明 |
1 |
loginlogid |
關係型資料庫的表物理主鍵,在Redis中,若沒有引用,則可不要 |
2 |
userid |
使用者名稱稱 |
3 |
logintime |
登入時間 |
4 |
logouttime |
退出時間 |
表名:online :線上人員
序號 |
欄位名 |
說明 |
1 |
onlineid |
關係型資料庫的表物理主鍵,在Redis中,若沒有引用,則可不要 |
2 |
userid |
使用者id |
3 |
logintime |
登入時間 |
4 |
token |
令牌 |
- Redis 鍵名設計:
序號 |
鍵名設計 (包含的內容) |
舉例 |
1 |
1:2:3:4:5:6:7:8 |
key = sys:user:userid:888:base:username:1:217453 value = username的值
說明:通過userid, 儲存、讀取 username 資訊 |
2 |
2:3:4:6 實體名:查詢欄位名:欄位值:列名 |
key = user:userid:888:username: value = username的值 說明:通過userid, 獲得username
key = user:username:edwin:userid value = userid 說明:通過username 找到 userid |
3 |
2:4:6 實體名:欄位值:列名 |
key = user:888:username (對應主鍵欄位名為 userid) value = username的值
只適合主鍵欄位(或每個實體的預設欄位),開發過程中應該非常明確,沒有歧義 不建議根據資料型別來區別不同欄位,程式碼容易混 |
4 |
2:4 實體名: 欄位值 |
key = user:888 (對應預設主鍵欄位: userid) value = 跟當前userid 相關的值列表 |
5 |
2:3 實體名:欄位名 |
key = online:userid value = userid列表
說明:所有線上使用者的userid列表 |
6 |
2: 實體名: |
key = loginlog: value = 日誌列表 |
7 |
擴充套件用法 |
結合多個列,甚至多個實體的組合鍵設計 |
- 特別說明
在redis 中,所有鍵名都是唯一的,且都在同一個物理結構級別,不分層級;但不同的鍵值,儲存的業務資訊各不相同,業務層級結構各不相同
- 儲存整個資料庫的系統資訊
- 儲存某個 entity的整體資訊,
- 儲存entity的一條記錄;
- 儲存entity的一條記錄的一個欄位的值
- 儲存一對多的關係,
- 儲存多對多的關係,等等