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