《Redis-设计与实现》读书笔记-Redis-对象.docxVIP

《Redis-设计与实现》读书笔记-Redis-对象.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
? ? 《Redis 设计与实现》读书笔记-Redis 对象 ? ? 一、Redis 对象 1.1 Redis 对象简介 Redis 使用对象来表示数据库中键和值,当我们在数据库中存储一个键值对时,至少会创建两个对象,一个对象用于存储键值对的键,另一个对象用于存储键值对的值。 Redis 中的每一个对象都由一个 redisObject 结构表示,该结构有三个属性和保存的数据有关,分别是 type 属性、encoding 属性和 ptr 属性。 typedef struct redisObject { // 类型 unsigned type:4; // 编码 unsigned encoding:4; // 指向底层数据实现数据结构的指针 void *ptr; } robj; 1.2 对象类型 redisObject 对象的 type 属性记录了对象的类型,Redis 中的键总是一个字符串对象,值对象可以是字符串对象、哈希对象、集合对象等。 我们可以通过使用 TYPE key 命令查看数据库键对应的值对象的类型。 1.3 编码与底层实现 encoding 属性记录了对象所使用的编码,也就是这个对象底层实现的数据结构。关于编码可以使用 OBJECT ENCODING key 命令查看。 二、五种数据类型对象与编码 2.1 字符串对象 要注意的是 long、double 浮点数在 Redis 中也是作为字符串值来保存的。 (1)字符串对象编码 字符串对象的编码有 int 、 raw 或者 embstr 三种。 int:保存的是整数值 raw:保存的是字符串,并且字符串的长度小于等于 39 个字节 embstr:保存的是字符串,并且字符串的长度大于等于 39 个字节 embstr 编码的好处: embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次。 释放 embstr 编码的字符串对象只需要调用一次内存释放函数, 而释放 raw 编码的字符串对象需要调用两次内存释放函数。 因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起 raw 编码的字符串对象能够更好地利用缓存带来的优势。 (2)编码转换 int 编码的字符串对象和 embstr 编码的字符串对象在一定条件下, 会被转换为 raw 编码的字符串对象,如下。 int 编码的字符串对象通过某些操作,保存的不再是单纯的整数值 对 embstr 编码的字符串对象执行任何修改命令时, 程序会先将对象的编码从 embstr 转换成 raw , 然后再执行修改命令 下面是一个例子,供参考: 127.0.0.1:6379 SET num-str 100 OK 127.0.0.1:6379 OBJECT ENCODING num-str int # 追加元素内容 127.0.0.1:6379 APPEND num-str hei~ (integer) 7 127.0.0.1:6379 OBJECT ENCODING num-str raw 2.2 列表对象 (1)列表对象编码 Redis 3.2 以前的版本中列表的的编码类型有 ziplist 或 linkedlist。 ziplist 编码的列表对象使用压缩列表作为底层实现, 每个压缩列表节点(entry)保存了一个列表元素。 linkedlist 编码的列表对象使用双端链表作为底层实现, 每个双端链表节点(node)都保存了一个字符串对象, 而每个字符串对象都保存了一个列表元素。 在 Redis 3.2 以上的版本中列表对象的编码替换为 quicklist,它的底层实现是一个双向链表,而且是一个ziplist 数据结构的双向链表。关于这种数据结构的详细信息就不介绍了,以后有机会接触到 Redis 的源码后再单独拿出来总结。 例子如下(基于 3.2.× 版本): 127.0.0.1:6379 RPUSH students zs ls ww (integer) 3 127.0.0.1:6379 OBJECT ENCODING students quicklist 2.3 哈希对象 (1)哈希对象编码 哈希对象的编码是 ziplist 或 hashtable。 ziplist 编码的哈希对象使用压缩列表作为底层实现,每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到压缩列表表尾,然后再将保存了值的压缩列表节点推入到压缩列表表尾。因此保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后。 hashtable 编码的哈希对象使用字典作为底层实现,哈希对象中的每个键值

文档评论(0)

科技之佳文库 + 关注
官方认证
文档贡献者

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

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

1亿VIP精品文档

相关文档