- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
Redis字典的实现 《Redis设计与实现》
?
?
实现字典的方法有很多种:? 最简单的就是使用链表或数组,但是这种方式只适用于元素个数不多的情况下;? 要兼顾高效和简单性,可以使用哈希表; // Hash无法实现稳定性? 如果追求更为稳定的性能特征,并且希望高效地实现排序操作的话,则可以使用更为复 杂的平衡树;在众多可能的实现中,Redis 选择了高效且实现简单的哈希表作为字典的底层实现
数据结构实现
dict.h/dict 给出了这个字典的定义
/* * 字典 * * 每个字典使用两个哈希表,用于实现渐进式 rehash */
typedef struct dict {
// 特定于类型的处理函数
dictType *type;
// 类型处理函数的私有数据
void *privdata;
// 哈希表(2 个)
dictht ht[2];
// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;
// 当前正在运作的安全迭代器数量
int iterators;
} dict;
以下是用于处理 dict 类型的 API ,它们的作用及相应的算法复杂度:注意 dict 类型使用了两个指针分别指向两个哈希表。其中,0 号哈希表(ht[0])是字典主要使用的哈希表,而 1 号哈希表(ht[1])则只有在程序 对 0 号哈希表进行 rehash 时才使用。接下来两个小节将对哈希表的实现,以及哈希表所使用的哈希算法进行介绍。
哈希表实现
字典所使用的哈希表实现由 dict.h/dictht 类型定义
/* * 哈希表 */
typedef struct dictht {
// 哈希表节点指针数组(俗称桶,bucket)
dictEntry **table;
// 指针数组的大小
unsigned long size;
// 指针数组的长度掩码,用于计算索引值
unsigned long sizemask;
// 哈希表现有的节点数量
unsigned long used;
} dictht;
table 属性是一个数组,数组的每个元素都是一个指向 dictEntry 结构的指针。 每个 dictEntry 都保存着一个键值对,以及一个指向另一个 dictEntry 结构的指针:
/* * 哈希表节点 */
typedef struct dictEntry {
// 键
void *key;
// 值
union { void *val; uint64_t u64; int64_t s64; } v;
// 链往后继节点
struct dictEntry *next;
} dictEntry;
next 属性指向另一个 dictEntry 结构,多个 dictEntry 可以通过 next 指针串连成链表,从 这里可以看出,**dictht 使用链地址法来处理键碰撞:**当多个不同的键拥有相同的哈希值时,哈 希表用一个链表将这些键连接起来。下图展示了一个由 dictht 和数个 dictEntry 组成的哈希表例子:如果再加上之前列出的 dict 类型,那么整个字典结构可以表示如下:在上图的字典示例中,字典虽然创建了两个哈希表,但正在使用的只有 0 号哈希表,这说明字 典未进行 rehash 状态。
素材来自: 《Redis设计与实现》
?
-全文完-
您可能关注的文档
- Python网络程序设计教学要点与案例分享.docx
- python网络通信器设计.docx
- Python计算生态概览.docx
- Python设计模式面向对象编程.docx
- Python语言程序设计-学习笔记和练习.docx
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- 功能设计_MM_MM015_报废单_20080109_v2.0.doc
- 功能设计_MM_MM021_采购订单批导入程序_20080108_v1.0.doc
- 功能设计_MM_MM020_出库单_20071205_v2.1.doc
- 功能设计_MM_MM019_入库单_20071205_v2.1.doc
- 功能设计_MM_MM018_领料单_20080114_v2.0.doc
- 功能设计_MM_MM016_ERP与招投标系统接口_20080327_v1.2.doc
- 功能设计_MM_MM014_退库单_20080109_v1.0.doc
- 功能设计_MM_MM013_物料盘点清单_20080114_v2.0.doc
- 中考数学知识点10 一元一次不等式(组)(2).pdf
- 七年级数学优质课公开课教案教学设计期中综合检测.pdf
文档评论(0)