8.1 对象的类型与编码

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性

typedef struct redisObject{
// 类型
unsigned type:4; // 编码
unsigned encoding:4; // 指向底层实现数据结构指针
void *ptr; // ...
}robj;

类型

编码和底层实现

通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一定的编码,极大地提升了Redis的灵活性和效率,因为Redis可以根据不用的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率

8.2 字符串对象

如果字符串对象保存的是一个字符串值,并且字符串值的长度大于39字节,那么字符串对象将使用简单动态字符串来保存这个字符串值

编码的转换

因为Redis没有为embstr编码的字符串编写任何的修改程序,所以对embstr编码的字符串对象实际上是只读的,当我们对embstr编码的字符串对象执行任何修改命令时,程序会先将对象的编码从embstr转换成raw,然后执行修改命令

字符串命令的实现

8.3 列表对象

编码转换

当列表对象可以同时满足以下两个条件时,列表对象使用ziplist编码

  • 列表对象的所有字符串元素的长度都效于64字节

  • 列表对象保存的元素数量小于512个;

    不能满足这两个条件的列表对象需要使用linkedlist编码

8.4 哈希对象

哈希对象的编码可以是ziplist 或者 hashtable

ziplist编码的哈希对象

hashtable编码的哈希对象

编码转换

当哈希对象可以同时满足一下两个条件时,哈希对象使用ziplist编码

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于64字节
  • 哈希对象保存的键值对数量小于512个

不能满足这两个条件的哈希对象需要使用hashtable编码

哈希命令的实现

8.5 集合对象

集合对象的编码可以是intset 或者 hashtable

intset编码集合对象

hashtable编码集合对象

编码的转换

当集合对象可以同时满足一下两个条件时,对象使用intset编码:

  • 集合对象保存的所有都是整数值

  • 集合对象保存的元素数量不超过512个

    当集合对象可以同时满足以下两个条件时,对象使用inteset编码

8.4 有序集合对象

有序集合的编码可以时ziplist 或者 skiplist

ziplist编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存

压缩列表内的集合元数按分支从小到大进行排序

编码的转换

当有序集合对象可以同时满足以下两个条件时,对象使用ziplist编码

  • 有序集合保存的元素数量小于128个
  • 有序集合保存的所有元素成员的长度都小于64字节

不能满足以上两个条件的有序集合集合将使用skiplist编码

有序集合命令的实现

8.7 类型检查与命令多态

多态命令的实现

我们可以将DEL、EXPIRE、TYPE等命令也称为多态命令,因为无论输入的键是什么类型,这些命令都可以正确地执行

8.8 内存回收

通过引用计数机制实现内存回收

typedef struct redisObject{
//... // 引用计数
int refcount; //...
}

8.9 对象共享

不共享包含字符串的对象,性能消耗高

【笔记】《Redis设计与实现》chapter8 对象的更多相关文章

  1. Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

    目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...

  2. Redis | 第一部分:数据结构与对象 下篇《Redis设计与实现》

    目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对 ...

  3. Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》

    目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压 ...

  4. 《Redis设计与实现》读书笔记

    <Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...

  5. 《Redis设计与实现》阅读笔记(一)--Redis学习

    Redis学习资料与过程记录 在实习中经常会用到很多Redis,对Redis有了一些模糊的了解,总觉得隔靴搔痒的不痛快,所以决定开始深入的了解Redis,也作为我实习期间的目标. 这篇只是为了占个位置 ...

  6. Redis 学习笔记(篇五):对象(RedisObject)

    Redis-对象 在以前的文章中,我们介绍了 Redis 用到的主要数据结构,比如简单动态字符串.双端链表.字典.压缩列表.整数集合. 然而 Redis 并没有直接使用这些数据结构来实现键值对的数据库 ...

  7. Redis设计与实现:读书笔记之一

    第一部分:数据结构与对象 Redis支持的数据类型 字符串对象 列表对象 Hash对象 集合对象 有序集合对象 2.数据结构 Redis的所有数据类型都是: key-value pair 对象 Red ...

  8. Redis设计与实现-内部数据结构篇

    题记:这本书是2015年11月份开始读的,大约花了一个多月的时间通读了一遍,最近由于需要对redis做一些深入的了解,因此又花了两个多月仔细精读了一遍,由于本书设计的内容较多,且每部分的内容都比较细致 ...

  9. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  10. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

随机推荐

  1. 【转】奇异值分解(SVD)原理详解及推导

    原文地址:https://blog.csdn.net/zhongkejingwang/article/details/43053513,转载主要方便随时查阅,如有版权要求,请及时联系. 在网上看到有很 ...

  2. Java NIO wakeup实现原理

    本文转载自Java NIO wakeup实现原理 导语 最近在阅读netty源码时,很好奇Java NIO中Selector的wakeup()方法是如何唤醒selector的,于是决定深扒一下wake ...

  3. JVisualVM监控JVM-外网服务器

    环境说明: a:阿里云服务器Centos8.2 b:JDK1.8 1:增加JMV运行参数 java -jar 启动时添加一下参数: -Djava.rmi.server.hostname=外网IP地址 ...

  4. CentOS7安装Kibana7.9.2

    1:下载 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.2-linux-x86_64.tar.gz 点击进入官网 安装手册 ...

  5. CentOS7安装ZooKeeper3.4.14

    1:下载安装包 wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz 点击进入官网下 ...

  6. 基于Docker Compose部署分布式MinIO集群

    一.概述 Minio 是一个基于Go语言的对象存储服务.它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器 ...

  7. 后端程序员之路 18、朴素贝叶斯模型(Naive Bayesian Model,NBM)

    贝叶斯推断及其互联网应用(一):定理简介 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.ht ...

  8. 阿里巴巴Druid,轻松实现MySQL数据库连接加密!

    为什么要加密? 现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub.Gitee 或是自建服务器),但只要将源码提交到公网服务器就会存在源码泄漏的风险,而 ...

  9. 从客流统计到营销赋能,Re-ID加速实体商业数字化转型 | 爱分析洞见

    2020年中国实体商业受到突发疫情的重大影响.以危机为契机,实体商业加速数字化转型,利用创新应用服务自身业务.在此阶段,基于Re-ID(Person Re-identification,即行人再识别) ...

  10. 在ASP.NET Core中用HttpClient(一)——获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...