標籤:
redis是個key, value資料庫,是個記憶體資料庫。目前是個互連網公司的架構標配。
支援的資料對象有string, list, set, zest和hash object。
資料結構:
資料庫的核心結構是dict(實現是使用hashmap):
key: string
value: string或者list或者set或者zest或者hash object。
dict資料結構定義:
typedef struct dictht { // 雜湊表數組 dictEntry **table; // 雜湊表大小 unsigned long size; // 雜湊表大小掩碼,用於計算索引值 // 總是等於 size - 1 unsigned long sizemask; // 該雜湊表已有節點的數量 unsigned long used;} dictht;
table是個雜湊表數組,每個元素是個dictEntry(雜湊節點)指標,dictEntry的定義如下:
typedef struct dictEntry { // 鍵 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下個雜湊表節點,形成鏈表 struct dictEntry *next;} dictEntry;
其中,key是雜湊表的鍵, value是val指向的對象(string, list, set, zest和hash object),或者是64位無符號的整形,或者64位有符號的整形, next是指向下個雜湊節點的指標。
資料結構圖表示如下:
資料庫:上面介紹了資料庫的核心資料結構,現在從資料庫的服務啟動角度剖析下。啟動的入口main函數:
int main(int argc, char **argv) {//...//初始化服務initServer();//...}
initServer函數:
void initServer(){ //... /* Create the Redis databases, and initialize other internal state. */ // 建立並初始化資料庫結構 for (j = 0; j < server.dbnum; j++) { server.db[j].dict = dictCreate(&dbDictType,NULL); server.db[j].expires = dictCreate(&keyptrDictType,NULL); server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL); server.db[j].ready_keys = dictCreate(&setDictType,NULL); server.db[j].watched_keys = dictCreate(&keylistDictType,NULL); server.db[j].eviction_pool = evictionPoolAlloc(); server.db[j].id = j; server.db[j].avg_ttl = 0; } //...}
其中: struct reidsServer server;//server對象的定義。
redisServer結構:
struct redisServer {// …// redis資料庫數組redisDb *db;<span style="white-space:pre"></span>// 資料庫的數量<span style="white-space:pre"></span>int dbnum;//...}
一個redisServer可以定義dbnum個資料庫,在使用的過程中可以切換,使用select命令,比如:select 0, select 1。。。
redisDb的資料結構:
/* Redis database representation. There are multiple databases identified * by integers from 0 (the default database) up to the max configured * database. The database number is the 'id' field in the structure. */typedef struct redisDb {// 資料庫鍵空間,儲存著資料庫中的所有索引值對 dict *dict; /* The keyspace for this DB */// 鍵的到期時間,字典的鍵為鍵,字典的值為到期事件 UNIX 時間戳記 dict *expires; /* Timeout of keys with a timeout set */// 正處於阻塞狀態的鍵 dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */// 可以解除阻塞的鍵 dict *ready_keys; /* Blocked keys that received a PUSH */// 正在被 WATCH 命令監視的鍵 dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */struct evictionPoolEntry *eviction_pool; /* Eviction pool of keys */// 資料庫號碼int id; /* Database ID */// 資料庫的鍵的平均 TTL ,統計資訊long long avg_ttl; /* Average TTL, just for stats */} redisDb;
可以看出核心就是個雜湊表dict。
redis 源碼學習(核心資料結構剖析)