Redis 使用對象來表示數(shù)據(jù)庫中的鍵和值趟薄, 每次當(dāng)我們在 Redis 的數(shù)據(jù)庫中新創(chuàng)建一個鍵值對時羡铲, 我們至少會創(chuàng)建兩個對象贾费, 一個對象用作鍵值對的鍵(鍵對象)导犹, 另一個對象用作鍵值對的值(值對象)节猿。
舉個例子太雨, 以下 SET 命令在數(shù)據(jù)庫中創(chuàng)建了一個新的鍵值對兜看, 其中鍵值對的鍵是一個包含了字符串值 "msg" 的對象葫哗, 而鍵值對的值則是一個包含了字符串值 "hello world" 的對象:
redis> SET msg "hello world"
OK
Redis 中的每個對象都由一個 redisObject 結(jié)構(gòu)表示, 該結(jié)構(gòu)中和保存數(shù)據(jù)有關(guān)的三個屬性分別是 type 屬性、 encoding 屬性和 ptr
屬性:
typedef struct redisObject {
// 類型
unsigned type:4;
// 編碼
unsigned encoding:4;
// 指向底層實現(xiàn)數(shù)據(jù)結(jié)構(gòu)的指針
void *ptr;
// ...
} robj;
type 可能的取值情況:
REDIS_STRING 字符串對象
REDIS_LIST 列表對象
REDIS_HASH 哈希對象
REDIS_SET 集合對象
REDIS_ZSET 有序集合對象
對于 Redis 數(shù)據(jù)庫保存的鍵值對來說毒涧, 鍵總是一個字符串對象捡偏, 而值則可以是字符串對象彤避、列表對象模孩、哈希對象、集合對象或者有序集合對象的其中一種数焊, 因此:
- 當(dāng)我們稱呼一個數(shù)據(jù)庫鍵為“字符串鍵”時干厚, 我們指的是“這個數(shù)據(jù)庫鍵所對應(yīng)的值為字符串對象”芹助;
- 當(dāng)我們稱呼一個鍵為“列表鍵”時饵蒂, 我們指的是“這個數(shù)據(jù)庫鍵所對應(yīng)的值為列表對象”慰照,
TYPE 命令的實現(xiàn)方式也與此類似墅垮, 當(dāng)我們對一個數(shù)據(jù)庫鍵執(zhí)行 TYPE 命令時峡钓, 命令返回的結(jié)果為數(shù)據(jù)庫鍵對應(yīng)的值的類型
捧灰, 而不是鍵對象的類型煌寇。
對象 | 對象 type 屬性的值 | TYPE 命令的輸出 |
---|---|---|
字符串對象 | REDIS_STRING | "string" |
列表對象 | REDIS_LIST | "list" |
哈希對象 | REDIS_HASH | "hash" |
集合對象 | REDIS_SET | "set" |
有序集合對象 | REDIS_ZSET | "zset" |
底層實現(xiàn)的編碼
encoding 屬性記錄了對象所使用的編碼击纬, 也即是說這個對象使用了什么數(shù)據(jù)結(jié)構(gòu)作為對象的底層實現(xiàn)肯腕, 這個屬性的值可以是表列出的常量的其中一個捷兰。
編碼常量 | 編碼所對應(yīng)的底層數(shù)據(jù)結(jié)構(gòu) |
---|---|
REDIS_ENCODING_INT | long 類型的整數(shù) |
REDIS_ENCODING_EMBSTR | embstr 編碼的簡單動態(tài)字符串 |
REDIS_ENCODING_RAW | 簡單動態(tài)字符串 |
REDIS_ENCODING_HT | 字典 |
REDIS_ENCODING_LINKEDLIST | 雙端鏈表 |
REDIS_ENCODING_ZIPLIST | 壓縮列表 |
REDIS_ENCODING_INTSET | 整數(shù)集合 |
REDIS_ENCODING_SKIPLIST | 跳躍表和字典 |
不同類型和編碼的對象
每種type對應(yīng)兩種編碼
type | encoding | 對象 |
---|---|---|
REDIS_STRING | REDIS_ENCODING_INT | 使用整數(shù)值實現(xiàn)的字符串對象 |
REDIS_STRING | REDIS_ENCODING_EMBSTR | 使用 embstr 編碼的簡單動態(tài)字符串實現(xiàn)的字符串對象秽浇。 |
REDIS_STRING | REDIS_ENCODING_RAW | 使用簡單動態(tài)字符串實現(xiàn)的字符串對象搅轿。 |
REDIS_LIST | REDIS_ENCODING_ZIPLIST | 使用壓縮列表實現(xiàn)的列表對象雀鹃。 |
REDIS_LIST | REDIS_ENCODING_LINKEDLIST | 使用雙端鏈表實現(xiàn)的列表對象。 |
REDIS_HASH | REDIS_ENCODING_ZIPLIST | 使用壓縮列表實現(xiàn)的哈希對象焙畔。 |
REDIS_HASH | REDIS_ENCODING_HT | 使用字典實現(xiàn)的哈希對象留搔。 |
REDIS_SET | REDIS_ENCODING_INTSET | 使用整數(shù)集合實現(xiàn)的集合對象。 |
REDIS_SET | REDIS_ENCODING_HT | 使用字典實現(xiàn)的集合對象薄声。 |
REDIS_ZSET | REDIS_ENCODING_ZIPLIST | 使用壓縮列表實現(xiàn)的有序集合對象抱婉。 |
REDIS_ZSET | REDIS_ENCODING_SKIPLIST | 使用跳躍表和字典實現(xiàn)的有序集合對象。 |