Redis的寻址过程

Redis的结构

redisDb.id:保存数据库的整数表示号码

redisDb.dict:保存键值对的数据

redisDb.expires:保存键的过期时间

 

redis的字典是采用哈希表加链表作为其底层实现,dict类型使用2个指针,指向哈希表的地址。传送门

0号哈希表主要用于存储了数据库的所有键值对数据,

1号哈希表是程序对0号哈希表的rehash时用到,rehash一般是在新增键值对的时候触发,

综上可以看出,redis根据key值查找value值时,其实就是在dict里面的0号哈希表(h[0])进行查找操作。

 

根据key值寻址包含以下步骤:

①先判断0号哈希表,1号哈希表是否为空,如果0号为空则直接返回null。

②判断0号是否在进行rehash,如果处于rehashing阶段,那么2个表都可能存在key。如果正在进行 rehash,

将调用一次_dictRehashStep 方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash。

③先计算hash值,根据当前字典和key值,计算出hash值。

④计算出索引,根据当前字典和hash值,计算出key所在的索引。

⑤根据索引值,找到对应的链表,遍历链接找到key匹配的数据。

⑥当 ht[0] 查找完了之后,再进行了次 rehash 判断,如果未在 rehashing,则直接结束,否则对 ht[1]重复 345 步骤。

(如果处于rehashing阶段,则ht[1]可能也存在key,此时需要在ht[1]上重复345步骤,

   如果没有处于rehash阶段,则ht[1]是空的也就没有判断的必要)

备注:如果redis是集群部署的,则需要先判断key值在哪个节点上。

你可能感兴趣的:(后端,redis)