我知道没有主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;

键redisObject.ptr指向键的值,而不是该值的值

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

最佳答案

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

当您向db添加键时,它首先使用哈希函数来计算索引。索引告诉redis哪个存储桶应容纳此密钥。然后,redis为密钥创建一个条目,将该条目添加到属于此存储桶的链表的头部,并将值的对象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将密钥添加到db。

这是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 - 与Redis键RedisObject和Redis值RedisObject的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45906142/

10-10 18:00