Redis设计与实现-读书笔记.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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字节,使用压缩列表ziplist 2、否则,使用双向链表linkedlist 哈希对象 1、键值对数量512 且 所有键和值长度小于64字节,使用ziplist 2、否则,使用hashtable 集合对象 1、所有元素都是整数 且 元素数量= 512 ,使用intset 2、否则,使用hashtable 有序集合 1、元素个数128 且 所有元素长度64,使用ziplist 2、否则,使用skiplist ??skiplist编码的有序集合对象使用zset结构作为底层实现,一个zset结构同时包含一个字典和一个跳跃表。 typedef struct zset { zskiplist *zsl; dict * dict; } 为什么同时使用跳跃表和字典实现? 1、字典实现O(1)查找复杂度,适合点查询和点处理。 2、字典提供有序访问,适合批量查询和处理。 思想:通过空间换时间。 内存回收 ??通过引用计数技术实现内存的回收机制。 对象共享 ??整数值对象,通过指针指向共同的存储对象,节省空间。类似Java JVM中string对象的共享,包名、静态字符串等会共享一个对象。JVM在编译阶段处理对象共享,而Redis在程序执行阶段处理对象共享。 R

文档评论(0)

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

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

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

1亿VIP精品文档

相关文档