日期:2014-05-16  浏览次数:20526 次

Redis 存储结构分析,及哈希相关

Redis 是支持多 key-value 数据库 ( ) , 并用 RedisDb 来表示一个 key-value 数据库 ( ). redisServer 中有一个 redisDb *db; 成员变量 , RedisServer 在初始化时 , 会根据配置文件的 db 数量来创建一个 redisDb 数组 . 客户端在连接后 , 通过 SELECT 指令来选择一个 reidsDb, 如果不指定 , 则缺省是 redisDb 数组的第 1 ( 即下标是 0)redisDb. 一个客户端在选择 redisDb , 其后续操作都是在此 redisDb 上进行的 .

?

dictType 中定义的为各种函数 : 哈希函数 ,key 比较函数 ,key/value 复制函数等 .

dict 是主要是由 struct dictht 的哈希表构成的 , 之所以定义成长度为 2 (dictht ht[2]) 哈希表数组 , 是因为 redis 采用增量的 rehash. 这种渐进的 rehash 需要一个额外的 struct dictht 结构来保存 .

dictht 中的 table 是一个数组 + 指针形式的 hash 表, size hash 数组 ( ) 的大小, used 表示 hash 表的元素个数,这两个值与 rehash resize 过程密切相关。 sizemask 等于 size-1 ,这是为了方便将 hash 值映射到数组中。

iterators 记录当前 dict 中的迭代器数,主要是为了避免在有迭代器时 rehash ,在有迭代器时 rehash 可能会造成值的丢失或重复 .

rehashidx 表示上次 rehash 时在 ht[0] 的下标位置 .

?

关于 rehash:

1)原因:
redis使用的为动态大小的哈希表,当哈希表的大小不能满足需求,元素的hash碰撞比较多时进行扩容. 由于在数据结构中定义使用两个哈希表,当第一个表ht中的元素大