Redis设计与实现-第一部分-数据结构与对象-第4章-字典.docx

Redis设计与实现-第一部分-数据结构与对象-第4章-字典.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现 第一部分 数据结构与对象 第4章 字典 ? ? 应用场景 1.redis数据库底层实现 2.哈希键的底层实现(当一个哈希键包含的键值对比较多,或者是键值对的元素都是比较长的字符串的时候) 字典,又称符号表(symbol table)、关联数据(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。 在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对,等等。 字典的实现 redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。 哈希表 dict.h/dictht typedef struct dictht { //哈希表数组,每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry保存着一个键值对 dictEntry **table; //哈希表大小,table数组的大小 unsigned long size; //哈希表大小掩码,用于计算索引值,总是等于size-1,计算位置 unsigned long sizemask; //已有节点(键值对)数量 unsigned long used; } dictht; 哈希表节点 dict.h/dictEntry 键值对 typedef struct dictEntry { //键 void *key; //值 union{ void *val; //指针 unit64_tu64; //unit64_t 整数 int64_ts64; //int64_t 整数 } v; //指向下个哈希表节点,形成链表 可以将多个哈希值相同的键值对连在一起,以此解决键冲突的问题 struct dictEntry *next; } dictEntry; 字典 Redis中的字典由dict.h/dict结构表示 typedef struct dict { //类型待定函数 dictType *type; //指向dictType结构的指针,每个dictType结构保存了一簇用于特定类型键值对的函数,redis会为用途不同的字典设置不同的类型特定函数 //私有数据 void privdata; //保存了需要传给那些类型特定函数的可选参数 //哈希表 dictht ht[2]; //ht属性是一个包含两个项的数组,每一个都是一个dictht哈希表,字典只使用ht[0]哈希表,ht[1]哈希表只会在ht[0]哈希表进行rehash时使用。 //rehash索引,进度 //当rehash不在进行时,值为-1 in trehashidx; / rehashing ont in progress if rehashidx == -1 */ } dict; teypdef struct dictType { //计算哈希值的函数 unsigned int (*hashFunction) (const void *key); //复制键的函数 void *(*keyDup) (void *privdata, const void *key); //复制值的函数 void *(*valDup) (void *privdata, const void *obj); // 对比键的函数 int (*keyCompare) (void *privdata, const void *key1, const void *key2); //销毁键的函数 void (*valDestructor) (void *privdata, void *obj); } dictType; · 哈希算法 当要将一个新的键添加到字典里面时,程序需要先根据键值对的键计算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。redis计算hash值和索引值的方法如下: #假设字典设置的哈希函数,计算键key的哈希值 hash=dict-key-hashFunction(key); #使用哈希表的sizemask属性和哈希值,计算出索引值,根据不同情况,ht[x]可以是ht[0]或者ht[1] index = hash dict-ht[x].sizemask; 当字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用MurmurHash2算法来计算键的哈希值。 MurmurHash优点在于即使输入的键是有规律的,算法仍然可以给出

文档评论(0)

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

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

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

1亿VIP精品文档

相关文档