標籤:
robject
之前對redis基本的資料結構分別進行了簡單的介紹,包括字串、鏈表、雜湊表、整數集合、壓縮列表、壓縮字典等,但是redis並不是直接使用這些資料結構來實現key-value對資料庫的,而是基於這些資料結構為每一個對象建立一個對象robject。robject對象再根據資料類型,來選擇合適的底層資料結構來儲存資料。
robject的定義如下:
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:REDIS_LRU_BITS; /* lru time */ int refcount; void *ptr;} robj;
- type:4bit,對象的類型
- encoding:4bit,對象的編碼方式
- lru:24bit,記錄訪問時間
- refcount:引用計數
- ptr:指向具體的資料
1)類型
對象的類型共有5種可選類型:
/* Object types */#define REDIS_STRING 0#define REDIS_LIST 1#define REDIS_SET 2#define REDIS_ZSET 3#define REDIS_HASH 4
在redis中,key-value對中的鍵總是字串類型的,只有值可以是多種類型中的一種,因此當我們稱一個鍵為“字串鍵”時,是指這個鍵對應的value是字串類型的。
2)編碼方式
對象共有9種編碼方式,每種類型可以有多種不同的編碼方式:
#define REDIS_ENCODING_RAW 0 /* Raw representation */#define REDIS_ENCODING_INT 1 /* Encoded as integer */#define REDIS_ENCODING_HT 2 /* Encoded as hash table */#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap */#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */#define REDIS_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
例如,當我們在用戶端執行set msg “hello”命令時,那麼在資料庫中就會產生一個key-value對。redis會分別為key和value建立一個對象robject,對象的類型為字串類型REDIS_STRING,對象的編碼方式為REDIS_ENCODING_EMBSTR。當字串長度較長時,則對象的編碼方式會變為REDIS_ENCODING_RAW
命令
http://doc.redisfans.com/
這個網站對redis資料庫中命令進行了總結。
可以發現,對於不同的命令,底層會以不同的資料結構來實現,即不同的命令會導致對象的類型不同。
如執行set、get等命令時,產生的對象就是字串類型的。然後底層根據對象的長度來選擇合適的編碼方式。
當執行hset、hget命令時,產生的對象就是雜湊表類型的,然後再根據具體對象來選擇不同的編碼方式。
本文所引用的源碼全部來自Redis3.0.7版本
redis學習參考資料:
https://github.com/huangz1990/redis-3.0-annotated
Redis 設計與實現(第二版)
redis學習筆記(9)---對象robject