2017-08-27 39 views
1

的關係,我不知道母校的Redis鍵或Redis的值是一個redisObject
就是這個樣子與Redis的關鍵redisObject和Redis的價值redisObject

typedef struct redisObject { 
     unsigned type:4; 
     unsigned encoding:4; 
     unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ 
     int refcount; 
     void *ptr; 
    } robj; 

關鍵redisObject.ptr結構是指向鍵的值不值的值

但我想知道redis如何通過密鑰找到值?值的redisObject沒有ptr。

+0

https://github.com/antirez/redis#serverh –

回答

0

Redis使用哈希表機制來存儲快速檢索的鍵值。哈希表維護一個桶列表,每個桶都有一個鏈表來存儲鍵值。

當您向db添加密鑰時,它首先使用散列函數來計算索引。索引告訴redis哪個桶應該容納這個密鑰。然後,redis爲key創建一個條目,將條目添加到屬於該bucket的鏈表的頭部,並將值的對象ptr以及鍵對象的ptr保存到條目中。 該條目實際上是鏈接列表的一個元素。

所以,當你想通過鍵找到值,它使用哈希表來實現這一點。您可以閱讀dict.h/dict.c以瞭解更多信息。


更多的相關信息

db.c實現你想知道什麼樣的操作。

void setKey(redisDb *db, robj *key, robj *val) { 
    if (lookupKeyWrite(db,key) == NULL) { 
     dbAdd(db,key,val); 
    } else { 
     dbOverwrite(db,key,val); 
    } 
    incrRefCount(val); 
    removeExpire(db,key); 
    signalModifiedKey(db,key); 
    } 

但它只是一個包裝的功能,並在內部使用dbAdddbOverwrite添加關鍵分貝。

而這是dbAdd,它使用dictAdd鏈接鍵和val。

void dbAdd(redisDb *db, robj *key, robj *val) { 
    sds copy = sdsdup(key->ptr); 
    int retval = dictAdd(db->dict, copy, val); 

    serverAssertWithInfo(NULL,key,retval == DICT_OK); 
    if (val->type == OBJ_LIST) signalListAsReady(db, key); 
    if (server.cluster_enabled) slotToKeyAdd(key); 
} 

所以神奇的事情發生在dict.c中,閱讀它!