1. 程式人生 > 實用技巧 >Redis 物件的型別與編碼

Redis 物件的型別與編碼

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"