1. 程式人生 > >Redis 鍵名的設計

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 中,所有鍵名都是唯一的,且都在同一個物理結構級別,不分層級;但不同的鍵值,儲存的業務資訊各不相同,業務層級結構各不相同

  1. 儲存整個資料庫的系統資訊
  2. 儲存某個 entity的整體資訊,
  3. 儲存entity的一條記錄;
  4. 儲存entity的一條記錄的一個欄位的值
  5. 儲存一對多的關係,
  6. 儲存多對多的關係,等等