Redis设计与实现-第一部分-数据结构与对象.docx

Redis设计与实现-第一部分-数据结构与对象.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现 第一部分 数据结构与对象 第8章 对象 ? ? Reids并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象至少一种数据结构。 Redis根据对象的类型来判断对象是否可以执行给定的命令。使用对象可以针对不同的场景为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。 Redis的对象系统还实现了基于引用计数的内存回收机制,当程序不再使用某个对象的时候,这个对象所占用的内存就会被自动释放,另外redis还通过引用计数技术实现了对象共享机制。另外对象还带有访问时间记录信息,该信息在服务器启用了maxmemory功能的情况系啊,空转时长较大的那些键可能会优化被服务器删除。 对象的类型与编码 Redis使用对象来表示数据库中的键和值,每次当我们在redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。 Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性,encoding属性和ptr属性: typedef struct redisObject { //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现的数据结构的指针 void *prt; // … } robj; 类型 键的类型总是一个字符串对象 值的类型可以表8-1列出的常量的其中一个。 TYPE命令返回的也是值对象的类型,而不是键对象的类型。 编码和底层实现 对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。encoding属性记录了对象所使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是表8-3列出的常量中的一个。 每种类型的对象都至少使用了两种不同的编码来实现,表8-4列出了每种类型的对象可以使用的编码。 通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从 而优化对象在某一个场景下的效率。 举个例子,列表对象包含的元素比较少时,Redis使用压缩列表作为对象的底层实现: 1.因为压缩列表比双端链表节约内存,并且在元素数量较少时,在内存中以连续块的方式保存的压缩列表比起双端链表可以更快载入内存 2.随着列表对象包含的元素越来越多,使用压缩列表来保存元素的优势逐渐消失时,对象就会将底层实现从压缩列表转向功能更强、也更适合保存大量元素的双端链表上面。 字符串对象 值 编码 可以用long类型保存的整数 int 可以用long double类型保存的浮点数 embstr或raw 字符串值,或者因为长度太大而没办法用long类型表示的整数,又或者因为长度太大而没办法用long double类型表示的浮点数 embstr或者raw 字符串值,并且长度大于32字节 raw 字符串值,长度小于等于32字节 embstr embstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象,但使用embstr编码的字符串对象来保存短字符串有以下好处: 1.embstr编码将创建字符串对象所需的内存分配次数从raw的两次降低到一次。 2.释放embstr编码的字符串对象只需要调用一次内存释放函数,而raw需要两次 3.因为embstr编码的字符串对象的所有数据结构都保存在一块连续的内存里面,所以这种编码的字符串对象比起raw编码的字符串对象能够更好的利用缓存带来的优势。 编码的转换 int编码和embstr编码的字符串对象在条件满足的情况下,会被转换为raw编码的字符串对象。 embstr编码是只读的,int编码和raw可以修改,所以embstr在修改命令执行之后就变成了一个raw编码的字符串对象。 字符串命令的实现 列表对象 列表对象的编码可以是ziplist或者linkedlist。 编码转换 当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码: 1.列表对象保存的所有字符串元素的长度都小于64字节, 2.列表对象保存的元素数量小于512个 其它使用linkedlist编码 注意 以上两个条件的上限值是可以修改的,具体请看配置文件中关于list-max-ziplist-value选项和list

文档评论(0)

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

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

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

1亿VIP精品文档

相关文档