- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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;
// 指向下个哈希表节点
您可能关注的文档
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- RBAC权限系统分析、设计与实现.docx
- Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选.docx
- Redis+Nginx+设计模式+Spring全家桶+Dubbo精选概述.docx
- redis-list类型的设计与实现.docx
- redis-string类型的设计与实现.docx
- Redis为什么设计成单线程-第1篇.docx
- 中国行业标准 GM/T 0126-2023HTML密码应用置标语法.pdf
- 《JJF 2121-2024恒转速源校准规范》.pdf
- 餐饮服务中20条处理要点.docx
- 《GM/T 0011-2023可信计算 可信密码支撑平台功能与接口规范》.pdf
- 《JJF 2134-2024旋转流变仪校准规范》.pdf
- JJF 2121-2024恒转速源校准规范.pdf
- 计量规程规范 JJF 2121-2024恒转速源校准规范.pdf
- 《JJF 2118-2024压力式六氟化硫气体密度控制器校验仪校准规范》.pdf
- JJF 2134-2024旋转流变仪校准规范.pdf
- 计量规程规范 JJF 2134-2024旋转流变仪校准规范.pdf
最近下载
- 2024年高考地理新课标卷试题答案解析及备考指导课件.pdf
- 铸牢中华民族共同体意识-考试复习题库(含答案).docx VIP
- 2024年党纪学习教育ppt(党课).pptx VIP
- 至为芯科技多串锂电池充放电芯片IP5389 datasheet_cn_v1.02(1)(2).pdf
- 2024年四川凉山昭觉县事业单位招聘60人历年公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版.docx
- 全国托育大赛中职组(教师)备赛复习试题附答案.doc
- 金匮要略的基础知识点总结(考试必备).doc VIP
- 爱在日落黄昏时Before.Sunset.2004中英表格台词剧本.pdf
- PADI开放水域潜水员理论考试A卷.docx
- 项目经理考核细则.docx
文档评论(0)