- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
Redis设计与实现
读书笔记
?
?
数据结构与对象
SDS(Simple Dynamic String)
struct sdshdr {
int len;//已使用字节数
int free;//未使用字节数
char buf[];//字节数组
}
特点:1、空间预分配策略,减少内存重分配次数(内存分配涉及系统调用)。2、获取长度O(1),通过属性记录字符串长度。3、杜绝缓冲区一次,通过API对SDS进行修改时,会先检查空间是否满足条件。4、惰性空间释放。5、二进制安全,所有SDS API都会以二进制方式处理字节数组,不用像c字符串以\0结尾,能够存储图片、音频、视频、压缩文件等二进制数据。
链表
?? 带头结点的双向链表。
字典
??采用哈希表实现,通过联地址法解决键冲突。
Rehash
??让哈希表负载因子维持在一个合理的范围之内。1、渐进式Rehash,rehash的动作不是一次性、集中式完成的,而是分多次、渐进式处理。每次对字典执行添加、删除、查找或者更新操作,根据哈希函数计算出对应的一个哈希索引,将哈希索引对应的所有元素(链表)一起进行rehash,这样将整个rehash过程带来的性能损耗均摊到一系列操作上,平滑处理。当然,rehash过程中,数据分散在两张hash表中,对字典的操作会同时处理两个hash表。
跳跃表
??跳跃表支持平均O(logN)、最坏O(N)的节点查找,还可以通过顺序性操作来批量处理节点。思考:跳跃表借鉴数据库聚集索引的思想,通过多层索引,加快数据检索效率,用空间换时间。
整数集合
typedef struct intset {
uint32_t encoding;//编码方式
unit32_t length; //集合包含的元素数量
int8_t content[]; //保存元素的数组
}
??通过编码方式指导数组内容的解析,提供灵活的整数集合API。用尽可能小的内存,使用统一标准保存所有整数。
压缩列表
??压缩列表是Redis为了节约内存而开发。存储结构的设计思路参考Sql Server元组的存储结构,可以参看《Sql Server存储引擎》参考:/sunxianghuang/article/details对象
??Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含
字符串对象
列表对象
哈希对象
集合对象
有序集合对象
??Redis中的每个对象由一个RedisObject结构表示:
typedef struct redisobject {
unsigned type:4;//类型
unsigned encoding:4;//编码类型
void *ptr;//指向底层实现数据结构的指针
}
??Redis可以根据不同的使用场景来为一个对象设置不同的编码,即底层实现类型,从而优化对象在某一个场景下的效率。
字符串对象
1、保存的是整数值,并且这个整数可以用long类型表示,编码为int,即使用整数存储数据。2、保存的是字符串,并且长度 39字节,那么使用SDS存储数据,编码为raw。3、保存的是字符串,并且长度=39字节,编码为embstr,将redisobject和sdshdr存储在一块连续的内存空间,一方面减少内存分配次数,另一方面充分利用内存的缓存机制。
列表对象
1、元素数量512 且 所有元素长度小于64字节,使用压缩列表ziplist2、否则,使用双向链表linkedlist
哈希对象
1、键值对数量512 且 所有键和值长度小于64字节,使用ziplist2、否则,使用hashtable
集合对象
1、所有元素都是整数 且 元素数量= 512 ,使用intset2、否则,使用hashtable
有序集合
1、元素个数128 且 所有元素长度64,使用ziplist2、否则,使用skiplist
??skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表。
typedef struct zset {
zskiplist *zsl;
dict * dict;
}
为什么同时使用跳跃表和字典实现?1、字典实现O(1)查找复杂度,适合点查询和点处理。2、字典提供有序访问,适合批量查询和处理。思想:通过空间换时间。
内存回收
??通过引用计数技术实现内存的回收机制。
对象共享
??整数值对象,通过指针指向共同的存储对象,节省空间。类似Java JVM中string对象的共享,包名、静态字符串等会共享一个对象。JVM在编译阶段处理对象共享,而Redis在程序执行阶段处理对象共享。R
您可能关注的文档
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- 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
- 重庆七中2025届高考仿真卷化学试卷含解析.doc
- 福建省福州市福建师大附中2025届高考全国统考预测密卷生物试卷含解析.doc
- 山东省聊城市高唐一中2025届高三下学期联考生物试题含解析.doc
- 2025届贵州省黔东南市重点中学高考历史一模试卷含解析.doc
- 2025届广东省五校高三下学期联合考试生物试题含解析.doc
- 河南省邓州市花洲实验高级中学2025届高考化学倒计时模拟卷含解析.doc
- 2025届忻州市第一中学高考压轴卷生物试卷含解析.doc
- 安徽师范大学附属中学2025届高考历史倒计时模拟卷含解析.doc
- 2025届山东省临淄中学高三最后一卷历史试卷含解析.doc
- 湖南省长沙市宁乡一中2025届高三压轴卷历史试卷含解析.doc
文档评论(0)