如何找到redis数据库中key在内存中的位置
1.需要提前了解的知识
1. redis中的每个数据库都存储在一个redisDb结构中。其中,redisDb.id存储的是redis数据库中以整数表示的数字。 redisDb.dict存储库中所有的键值对数据。 redisDb.expires 存储每个key的过期时间。
2. redis服务器初始化时会预先分配16个数据库(数量可以通过配置文件配置),所有的database 保存到 redisServer.db 数组中,该数组是 redisServer 结构的成员。当我们选择数据库select编号时,程序直接通过redisServer.db[number]切换数据库。有时当程序需要知道自己在哪个数据库中时,可以直接读取redisDb.id。
3.既然我们知道一个数据库的所有键值都存储在redisDb.dict中,那么我们需要知道,如果我们要找到键的位置,就需要了解dict的结构:
复制代码代码如下:
typedef struct dict {
//类型特定的处理函数
dictType *类型;
//类型处理函数的私有数据
void *privdata;
//哈希表(2)
dicttht ht[2];
// 记录 rehash 进度的标志。值为-1表示未进行rehash
int rehasidx;
//当前运行的安全迭代器数量
int iterators;
} dict;< br/>可见f从上面的结构来看,redis字典使用了哈希表作为其底层实现。 dict 类型使用两个指向哈希表的指针。 0号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对哈希表进行rehash。 Rehash 通常在添加新值时触发,因此这里不再赘述。因此,在redis中查找某个key,实际上就是在dict结构中查找ht[0]。
4.既然是哈希,我们就知道会发生哈希冲突。那么当多个key经过哈希处理后值相同时我们该怎么办呢? Redis 使用链表来存储多个哈希冲突键。也就是说,根据key的哈希值找到链表后,如果链表的长度大于1,那么我们需要遍历链表来找到我们要找的key。当然,正常情况下,链表的长度为1,所以t时间复杂度可以视为o(1)。
2.当redis获取一个key的时候,如果找到了key的位置。
了解了以上知识后,我们就可以分析redis是否在内存中找到了key。
1. redis拿到一个key后,首先判断当前库的0号哈希表是否为空,即:if(dict->ht[0].size == 0)。如果为true,则直接返回NULL。
2.判断0号哈希表是否需要rehash,因为如果进行rehash,key可能会存储在两个表之一中。如果正在进行 rehash,则 _dictRehashStep 方法将被调用一次。 _dictRehashStep用于被动重新哈希数据库字典和哈希键字典,这里不再赘述。
3.计算哈希表,根据当前字典和key计算哈希值。
4.根据哈希值和当前字典计算哈希表的索引值。
5.从哈希表ac中取出链表根据索引值,遍历链表找到key的位置。一般情况下,链表的长度为1。
6.查找完ht[0]后,再次进行rehash判断。如果不是重新散列,就直接结束。否则,将对ht[1]重复步骤345。
此时我们已经找到了key在内存中的位置。
关于“如何找到redis数据库中key在内存中的位置”的学习就结束了。希望能够解答大家的疑惑。理论与实践相结合,能够更好的帮助大家学习,去尝试吧!如果您想继续了解更多相关知识,请继续关注网站。小编会继续努力,给大家带来更多实用的文章!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > 如何找到redis数据库中key在内存中的位置