数据库查找key在内存中的位置的方法
一、预先需要了解的知识
1、redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中, 存储着 redis 数据库以整数表示的号码。 存储着该库所有的键值对数据。res 保存着每一个键的过期时间。
2、当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 数组中。当我们选择数据库 select number 时,程序直接通过 [number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 即可。
3、既然我们知道一个数据库的所有键值都存储在中,那么我们要知道如果找到key的位置,就有必要了解一下dict 的结构了:
复制代码 代码如下:typedef struct dict {
// 特定于类型的处理函数
dictType *type;
// 类型处理函数的私有数据
void *privdata;
// 哈希表(2个)
dictht ht[2];
// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;
// 当前正在运作的安全迭代器数量
int iterators;
} dict;
由上述的.结构可以看出,redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以redis 中查找一个key,其实就是对进行该dict 结构中的 ht[0] 进行查找操作。
4、既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历该链表来找到我们所查找的key。当然,一般情况下链表长度都为是1,所以时间复杂度可看作o(1)。
二、当redis 拿到一个key 时,如果找到该key的位置。
了解了上述知识之后,我们就可以来分析redis如果在内存找到一个key了。
1、当拿到一个key后, redis 先判断当前库的0号哈希表是否为空,即:if (dict->ht[0] == 0)。如果为true直接返回NULL。
2、判断该0号哈希表是否需要rehash,因为如果在进行rehash,那么两个表中者有可能存储该key。如果正在进行rehash,将调用一次_dictRehashStep方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。
3、计算哈希表,根据当前字典与key进行哈希值的计算。
4、根据哈希值与当前字典计算哈希表的索引值。
5、根据索引值在哈希表中取出链表,遍历该链表找到key的位置。一般情况,该链表长度为1。
6、当 ht[0] 查找完了之后,再进行了次rehash判断,如果未在rehashing,则直接结束,否则对ht[1]重复345步骤。
到此我们就找到了key在内存的中位置了。
-
数据库期末考试答案
下面是小编整理的数据库期末考试答案,希望能帮助到大家!一、选择题(每题1分,共20分)1.在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中,数据独立性最高的是(A)阶段。A.数据库系统B.文件系统C.人工管理D.数据项管理2.数据库...
-
精选Excel建立数据库技巧
Excel建立数据库技巧日常工作中,我们常常需要建立一些有规律的数据库。例如我为了管理全乡的农业税,需建立一数据库,该数据库第一个字段名为村名,第二个字段名为组别。我乡共19个村,每个村7~17个组不等,共计258个组。这个数据库用数据库软件(哪怕是VisualFoxPro6.0或是...
-
玩家攻略系统初三作文
皓宇被自家母亲弄得一个头两个大的,而这边的晓晓正在神游中,却被系统打断,“恭喜玩家又朝着目标前进了一大步,依照这种速度发展,一定可以达到目标的,加油啊,欧尼”。晓晓自然是翘起了尾巴,嘿嘿,当然,也不看看偶是谁,美男自然都到我的碗里来了呗。皓宇看到身边的晓晓突然笑...
-
2017最新现代信息管理中数据库的运用现状与对策
现代信息管理中数据库的运用现状与对策对于生活在信息社会的人们来讲,每天需要处理很多信息,所以进一步促进了计算机数据库的应用和发展,尤其是在现代信息管理工作中,计算机数据库得到了非常广泛的应用。因此,本文通过简要介绍目前在现代信息管理工作计算机数据库的...