Redis设计与实现概述.docx

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现 读书笔记,用于提炼书中干货,便于学习、复习。 ? ? ? 一、数据结构 1、简单动态字符串????SDS ①在Redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的。 ②redis RPUSH fruits apple”“banana”cherry? ????(integer) 3? ????键值对的键是一千字符串对象,对象的底层实现是-斗保存了字符串 ” fruits” 的 sos。 ????键值对的值是一个列表对象,列表对象包含了三个字符串对象,这三个字符串对象分别由三个 sos 实现:第一个SDS保存着字符串 ” apple”,第二个SDS保存着字符串 "banana ”,第三个SDS保存着字符串 " cherry” 。 ③除了用来保存数据库中的字符串值之外,sos 还被用作缓冲区(buffer ) : AOF模块中的AOF缓冲区, 以及客户端状态中的输人缓冲区,都是由SDS实现的。 ④?free属性的值为0, 表示这个SDS没有分配任何未使用空间。 ????len属性的值为5, 表示这个SDS保存了一个五字节长的字符串。 ????buf属性是一个char类型的数组, 数组的前五个字节分别保存了 R、e、d、i、s五个字符,最后添加了一个空字符\0 ⑤保存空字符的1字节空间不计算在SDS的 len属性里面,好处是SDS可以直接重用一部分C字符串函数库里面的函数。 ⑥总结C字符串与SDS的区别: 比起C字符串, SDS具有以下优点 1)常数复杂度获取字符串长度。 2) 杜绝缓冲区溢出。 3) 减少修改字符串长度时所需的内存重分配次数。 4) 二进制安全。 5) 兼容部分C字符串函数。 SDS简单动态字符串,比起C字符串的优势: 获取字符串长度,时间复杂度为O(1) 增加、减少 字符串长度时,操作步骤小于等于C字符串 API安全,防止了缓冲区溢出 内容上,可以保存二进制数据,因为C字符串遇到空字符就会认为到末端了,SDS不会这样认为,会依据len属性判断是否到末端 由于最后按照C字符串的格式,存储了一个空字符,所以可以使用部分现成的C函数。 ? 2、链表???? ①C言并没有内置链表数据结构,所以Redis构建了自己的链表实现 ②链表结构,除了用于链表键之外, 发布与订阅、 慢查询、监视器等功能也用到了链表,Redis服务器本身还使用链表来保存多个客户端的状态信息, 以及使用链表来构建客户端输出缓冲区 ③链表节点结构图 ④list结构为链表提供了表头指针head、表尾指针tail, 以及链表长度计数器len,而dup、free和match成员则是用于实现多态链表所需的类型特定画数。 ⑤一个list结构和三个listNode 归结构组成的链表。 链表结构优势: 双端,查看当前节点的下一个节点、上一个节点,时间复杂度是O(1) 无环,头节点和尾节点的指针都指向null 带表头指针和表尾指针,可直接获取头节点和尾节点,时间复杂度为O(1) len属性可以直接获取链表长度,时间复杂度为O(1) 疑问点:24页三个函数值 3、字典 Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。 哈希表dictht结构: typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size - 1 unsigned long sizemask; // 该哈希表已有节点的数量 unsigned long used; } dictht; table?属性是一个数组, 数组中的每个元素都是一个指向?dict.h/dictEntry?结构的指针, 每个?dictEntry?结构保存着一个键值对。 size?属性记录了哈希表的大小, 也即是?table?数组的大小, 而?used?属性则记录了哈希表目前已有节点(键值对)的数量。 sizemask?属性的值总是等于?size?-?1?, 这个属性和哈希值一起决定一个键应该被放到?table?数组的哪个索引上面。 哈希表节点dictEntry结构: typedef struct dictEntry { // 键 void *key; // 值 union { void *val; uint64_t u64; int64_t s64; } v; // 指向下个哈希表节点

文档评论(0)

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

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

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

1亿VIP精品文档

相关文档