与redis key redisObject和redis value redisObject的关系

与redis key redisObject和redis value redisObject的关系,redis,Redis,我知道redis键或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

我知道redis键或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;
key redisObject.ptr指向键的值,而不是值的值


但我想知道redis如何通过键找到值?值的redisObject没有ptr。

Redis使用哈希表机制存储键值,以便快速检索。哈希表维护一个bucket列表,每个bucket都有一个链表来存储键值

当您向db添加一个键时,它首先使用哈希函数来计算索引。索引告诉redis哪个bucket应该容纳这个键。然后redis为key创建一个条目,将该条目添加到属于该bucket的链表头部,并将值的object ptr以及key对象的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);
  }
但它只是一个包装函数,在内部使用
dbAdd
dbOverwrite
将密钥添加到数据库中

这是
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,读吧

Redis使用哈希表机制存储键值,以便快速检索。哈希表维护一个bucket列表,每个bucket都有一个链表来存储键值

当您向db添加一个键时,它首先使用哈希函数来计算索引。索引告诉redis哪个bucket应该容纳这个键。然后redis为key创建一个条目,将该条目添加到属于该bucket的链表头部,并将值的object ptr以及key对象的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);
  }
但它只是一个包装函数,在内部使用
dbAdd
dbOverwrite
将密钥添加到数据库中

这是
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,读吧