Redis 物件的型別與編碼
阿新 • • 發佈:2020-12-22
Redis 使用物件來表示資料庫中的鍵和值, 每次當我們在 Redis 的資料庫中新建立一個鍵值對時, 我們至少會建立兩個物件, 一個物件用作鍵值對的鍵(鍵物件), 另一個物件用作鍵值對的值(值物件)。
舉個例子, 以下SET命令在資料庫中建立了一個新的鍵值對, 其中鍵值對的鍵是一個包含了字串值"msg"
的物件, 而鍵值對的值則是一個包含了字串值"helloworld"
的物件:
redis> SET msg "hello world" OK
Redis 中的每個物件都由一個redisObject
結構表示, 該結構中和儲存資料有關的三個屬性分別是type
屬性、encoding
屬性和ptr
屬性:
typedef struct redisObject { // 型別 unsigned type:4; // 編碼 unsigned encoding:4; // 指向底層實現資料結構的指標 void *ptr; // ... } robj;
型別
物件的type
屬性記錄了物件的型別, 這個屬性的值可以是表 8-1 列出的常量的其中一個。
對於 Redis 資料庫儲存的鍵值對來說, 鍵總是一個字串物件, 而值則可以是字串物件、列表物件、雜湊物件、集合物件或者有序集合物件的其中一種, 因此:
- 當我們稱呼一個數據庫鍵為“字串鍵”時, 我們指的是“這個資料庫鍵所對應的值為字串物件”;
- 當我們稱呼一個鍵為“列表鍵”時, 我們指的是“這個資料庫鍵所對應的值為列表物件”,
諸如此類。
TYPE命令的實現方式也與此類似, 當我們對一個數據庫鍵執行TYPE命令時, 命令返回的結果為資料庫鍵對應的值物件的型別, 而不是鍵物件的型別:
# 鍵為字串物件,值為字串物件 redis> SET msg "hello world" OK redis> TYPE msg string # 鍵為字串物件,值為列表物件 redis> RPUSH numbers 1 3 5 (integer) 6 redis> TYPE numbers list # 鍵為字串物件,值為雜湊物件 redis> HMSET profile name Tome age 25 career Programmer OK redis> TYPE profile hash # 鍵為字串物件,值為集合物件 redis> SADD fruits apple banana cherry (integer) 3 redis> TYPE fruits set # 鍵為字串物件,值為有序集合物件 redis> ZADD price 8.5 apple 5.0 banana 6.0 cherry (integer) 3 redis> TYPE price zset
編碼和底層實現
物件的ptr
指標指向物件的底層實現資料結構, 而這些資料結構由物件的encoding
屬性決定。
encoding
屬性記錄了物件所使用的編碼, 也即是說這個物件使用了什麼資料結構作為物件的底層實現, 這個屬性的值可以是表 8-3 列出的常量的其中一個。
使用OBJECT ENCODING命令可以檢視一個數據庫鍵的值物件的編碼:
redis> SET msg "hello wrold" OK redis> OBJECT ENCODING msg "embstr" redis> SET story "long long long long long long ago ..." OK redis> OBJECT ENCODING story "raw" redis> SADD numbers 1 3 5 (integer) 3 redis> OBJECT ENCODING numbers "intset" redis> SADD numbers "seven" (integer) 1 redis> OBJECT ENCODING numbers "hashtable"