Redis设计与实现之数据结构与对象-字典.docx

Redis设计与实现之数据结构与对象-字典.docx

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现之数据结构与对象 字典 ? ? 字典本身就是很常见的数据结构之一,在Redis中,Redis数据库就是使用字典来作为底层实现的,除了用来表示数据库之外,字典还是哈希键的底层实现之一。 建议阅读: 1、字典部分源码研究见: wenmingxing Redis源码研究之dict I、字典的实现 Redis的字典使用哈希表作为底层实现。 1.1 哈希表 Redis字典所使用的哈希表结构定义如下: typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size - 1 unsigned long sizemask; // 该哈希表已有节点的数量 unsigned long used; } dictht; table属性是一个数组,数组中的每个元素都指向一个dictEntry结构的指针,每个dictEntry结构保存着一个键值对。 size属性记录了哈希表的大小,即table数组的大小,而used属性则记录了哈希表目前已有键值对的数量。 sizemask属性的值总是等于size-1,这个属性和哈希值一起决定一个键应该被放到table数组的哪个索引上。 下图展示了一个大小为4的空哈希表: ? 1.2 哈希表节点 哈希表节点使用dictEntry结构表示,每个dictEntry结构都保存一个键值对: typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点,形成链表 struct dictEntry *next; } dictEntry; key属性保持着键值对中的键,而v属性则保存着键值对中的值,其中键值对中的值可以是一个指针,或者是一个整数。 next属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对连接在一起,来解决键冲突问题(以链表的方式解决冲突问题)。 如下图表示一个完成的哈希表: ? 1.3 字典 Redis中的字典结果如下: typedef struct dict { // 类型特定函数 dictType *type; // 私有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; /* rehashing not in progress if rehashidx == -1 */ } dict; type属性和privdata属性是针对不同类型的键值对,而创建多态字典而设置的: type属性是一个指向dictType结构的指针,每个dictType结构保存了一组用于操作特定类型键值对的函数,Redis会为用途不同的字典设置不同类型的特定函数。 而privadata属性则保存了需要传给那些类型特定函数的可选参数。 ht属性是一个包含了两个项的数组,数组中每个项都是一个dictht哈希表,一般情况下,字典只使用ht[0]哈希表,而ht[1]哈希表只对ht[0]哈希表进行rehash时使用。 另一个与rehash有关的就是rehashidx属性,它积累了rehash目前的进度,如果没有进行rehash,则它的值为-1。 下图为一个普通状态下的字典结构: ? II、哈希算法 将一个新的键值对添加到字典里面的时候,程序需要先根据键值对上面的键来计算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希数组的指定索引上面。 Redis计算哈希值和索引值的方法如下: # 使用字典设置的哈希函数,计算键 key 的哈希值 hash = dict-type-hashFunction(key); # 使用哈希表的 sizemask 属性和哈希值,计算出索引值 # 根据情况不同, ht[x] 可以是 ht[0] 或者 ht[1] index = hash dict-ht[x].sizemask; 下面举例说明一个完整的添加键值对k0, v0过程: 首先程序会先使用语句hash = dict-type-hashFunction(k0);计算的处k0的哈希值。 假设计算出的哈希值为8,

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地上海
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档