- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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/dicthttypedef 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不在进行时,值为-1in 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优点在于即使输入的键是有规律的,算法仍然可以给出
您可能关注的文档
- Python计算生态概览.docx
- Python设计模式面向对象编程.docx
- Python语言程序设计-学习笔记和练习.docx
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- RBAC权限系统分析、设计与实现.docx
- Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo.docx
- 重庆七中2025届高考仿真卷化学试卷含解析.doc
- 福建省福州市福建师大附中2025届高考全国统考预测密卷生物试卷含解析.doc
- 山东省聊城市高唐一中2025届高三下学期联考生物试题含解析.doc
- 2025届贵州省黔东南市重点中学高考历史一模试卷含解析.doc
- 2025届广东省五校高三下学期联合考试生物试题含解析.doc
- 河南省邓州市花洲实验高级中学2025届高考化学倒计时模拟卷含解析.doc
- 2025届忻州市第一中学高考压轴卷生物试卷含解析.doc
- 安徽师范大学附属中学2025届高考历史倒计时模拟卷含解析.doc
- 2025届山东省临淄中学高三最后一卷历史试卷含解析.doc
- 湖南省长沙市宁乡一中2025届高三压轴卷历史试卷含解析.doc
文档评论(0)