redis 源碼學習(核心資料結構剖析)

來源:互聯網
上載者:User

標籤:

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 源碼學習(核心資料結構剖析)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.