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值在哪个节点上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值