gpt4 book ai didi

redis - redis键redisObject和redis值redisObject的关系

转载 作者:可可西里 更新时间:2023-11-01 10:54:46 25 4
gpt4 key购买 nike

我知道没有mater redis key或redis value是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 使用Hash 表机制来存储key-value 以便快速检索。哈希表维护一个桶列表,每个桶都有一个链表来存储键值。

当你向数据库添加一个键时,它首先使用散列函数计算一个索引。索引告诉 Redis 哪个桶应该容纳这个键。然后redis为key创建一个entry,将entry添加到属于这个bucket的linked-list的头部,并将value的对象ptr,key对象的ptr保存到entry中。该条目实际上是链表的一个元素。

所以当你想通过键查找值时,它使用哈希表来实现这一点。您可以阅读 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 将 key 添加到数据库。

这是 dbAdd,它使用 dictAdd 来链接键和值。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com