Redis內(nèi)部存儲結(jié)構(gòu)
Redis內(nèi)部的存儲結(jié)構(gòu)是一個大的hashmap,內(nèi)部是數(shù)組實現(xiàn)的hash,key沖突通過掛鏈表去實現(xiàn),每個dictEntry為一個key/value對象,value為定義的redisObject.
結(jié)構(gòu)圖如下:
Redis結(jié)構(gòu)圖
dictEntry的結(jié)構(gòu)體如下:
/*
* 字典
*/
typedef struct dictEntry {
// 鍵
void *key;
// 值
union {
// 指向具體redisObject
void *val;
//
uint64_t u64;
int64_t s64;
} v;
// 指向下個哈希表節(jié)點,形成鏈表
struct dictEntry *next;
} dictEntry;
- redisObject的內(nèi)部結(jié)構(gòu)
/*
* Redis 對象
*/
typedef struct redisObject {
// 類型 4bits
unsigned type:4;
// 編碼方式 4bits
unsigned encoding:4;
// LRU 時間(相對于 server.lruclock) 24bits
unsigned lru:22;
// 引用計數(shù) Redis里面的數(shù)據(jù)
// 可以通過引用計數(shù)進行共享 32bits
int refcount;
// 指向?qū)ο蟮闹?64-bit
void *ptr;
} robj;
*ptr指向具體的數(shù)據(jù)結(jié)構(gòu)的地址;type表示該對象的類型,即String,List,Hash,Set,Zset中的一個,但為了提高存儲效率與程序執(zhí)行效率,每種對象的底層數(shù)據(jù)結(jié)構(gòu)都可能不止一種,encoding表示對象底層所使用的編碼.
Redis對象底層的八種數(shù)據(jù)結(jié)構(gòu)
1 REDIS_ENCODING_INT (long類型的整數(shù))
2 REDIS_ENCODING_EMBSTR embstr (編碼的簡單動態(tài)字符串)
3 REDIS_ENCODING_RAW (簡單動態(tài)字符串)
4 REDIS_ENCODING_HT (字典)
5 REDIS_ENCODING_LINKEDLIST (雙端鏈表)
6 REDIS_ENCODING_ZIPLIST (壓縮列表)
7 REDIS_ENCODING_INTSE (整數(shù)集合)
8 REDIS_ENCODING_SKIPLIST (跳躍表和字典)
以下是每種數(shù)據(jù)類型使用的數(shù)據(jù)結(jié)構(gòu)
5種類型使用的數(shù)據(jù)結(jié)構(gòu)