redis的对象
简介:redis并没有直接使用前面所提到的基本数据结构,而是基于基本的数据结构构造了一个对象系统。这个系统包含了字符串对象,列表对象,哈希对象,集合对象,有序集合对象五种类型的对象。每种对象都用到了至少一种我们前面所说的数据结构。
对象的类型和编码
redis使用对象来表示数据库中的键和值,每次当我们在redis数据库中创建一个键值对的时候,我们至少会创建两个对象。
redis中的每个对象都由一个redisObject结构表示:

1.对象类型
对象有以下几种类型:

对于redis数据库来说,键总是一个字符串对象,值可能是上述五种对象的其中一种。地方
Type命令在面对不同类型对象时所产生的输出如下:

2.对象编码
encodeing属性决定了ptr指针指向的底层数据结构的数据结构类型也称为对象编码。

每种类型的对象至少对应了两种不同的编码,下面列出每种对象可以使用的编码。
使用object encoding命令可以查看一个数据库的值对象的编码

下表展示了不同编码对象对应的object encoding命令的输出


通过encoding属性去设置对象的编码方式,极大地提高了redis存储对象的底层数据结构的灵活性,因为不同的数据结构适用的存储场景不一样,比如列表对象包含的元素比较少的时候,redis采用压缩列表作为存储的数据结构。当元素逐渐增多到某个值的时候又会变为双端链表作为存储的数据结构。
这是因为压缩列表比双端链表更节约内存,而且在元素数量较少时,在内存中以连续块方式保存的压缩列表比双端链表更容易载入到缓存。
字符串对象
字符串对象的编码可以是int,emstr,raw。
int保存的整数值对象,emstr保存的是小于32字节等于32字节的对象,raw保存的是大于32字节的对象。
emstr和raw的区别在于raw会调用两次内存分配函数分别创建redisObject结构和sdshdr结构,而embstr编码只会调用一次内存分配函数来分配一个连续的内存空间,空间中一次包含了redisObject和sdshdr两个结构。如下图所示:

使用emstr编码的字符串有以下的优势:
1》在创建和释放字符串对象时都只用对内存进行一次操作。
2》保存在一个内存块中的对象更容易被加载到缓存。
long和double类型的浮点数也是作为字符串保存的
1.编码的转换
int编码和emstr编码的字符串在条件满足的情况下可以转变为raw编码的字符串

比如上述代码中类型为int的10086append一个字符串,将会使最终结果的类型变为raw类型。
对于emstr类型的字符串只要执行了修改的命令就会将emstr类型转换为raw类型 。
3.字符串命令的实现

列表对象
列表对象的编码可以是ziplist或者是linkedlist
它们的结构如下图:


其中linkedlist对象中的字符串是一个字符串对象,如下图所示:

当列表对象同时满足以下两个条件时(不同版本的redis的定义可能不一样),列表对象将会用linkedlist实现,否则用ziplist实现。
1》列表中所有元素的占内存数小于64字节
2》列表中元素的个数小于512个

列表命令:

哈希对象
哈希对象的实现可以是ziplist或者是hashtable
两种方式分别如下图:


当哈希对象中的元素满足以下两个条件时,哈希对象用ziplist实现,否则用hashtable实现
1》哈希对象中的元素的占内存大小小于64字节。
2》哈希对象中的元素的个数小于512。
哈希命令:

集合对象
集合对象的实现可以是intset或者hashtable
两种方式分别如下图:

当集合对象的元素满足以下两个条件时,集合对象用intset实现,否则用hashtable实现。
1》集合对象中的元素都是整数
2》集合对象中的元素的数量不超过512
集合命令:


- 有序集合对象
有序集合对象有ziplist和skiplist两种实现


skiplist:


有序集合对象满足以下两个条件的时候用ziplist实现,否则用skiplist实现。
1》有序集合中元素的占内存大小小于64字节。
2》有序集合中元素的个数小于128。
有序集合命令:

redis的对象的更多相关文章
- redis object 对象系统
redis object对象系统 概述 redis 当中, sds字符串, adlist双向链表, dict字典, ziplist压缩链表, intset整数集合等均为底层数据结构 redis 并没有 ...
- redis存储对象
redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列 ...
- redis存储对象与对象序列化详解
redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列化接 ...
- Redis | 使用redis存储对象反序列化异常SerializationFailedException
案例 使用Redis进行对象存储,在处理业务逻辑的时候,丛Redis获取对象发现反序列化失败,抛出如下异常: Caused by: org.springframework.data.redis.ser ...
- 深入了解Redis(3)-对象
Redis主要的数据结构有简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合,等等.但Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个 ...
- Redis 存储对象信息是用 Hash 还是 String
Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(St ...
- 高性能的Redis之对象底层实现原理详解
对象 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合, 等等. Redis 并没有直接使用这些数据结构来实 ...
- redis存储对象,实体类新加字段空指针问题处理
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- redis存取对象
redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis不能直接存取对象,如何解决呢? 两种方式 1.利用序列化和反序列化的方式 两层对 ...
随机推荐
- SAP MM 公司间STO发货单输出报错 - 合并工厂AUC1和存储位置6002没有货物收货地点 - 之对策
SAP MM 公司间STO发货单输出报错 - 合并工厂AUC1和存储位置6002没有货物收货地点 - 之对策 昨天收到客户业务部门报错,说是业务对交货单0080022298做POD失败.相关交货单的输 ...
- KB奇遇记(3):糟糕的IT现状
2015年8月3号,终于告别了过去来到了KB. 公司给安排的住房是一间套房里的小房间,小的简直连坐的地方都没有了,中间一个大床将房间隔了两边,显得特别狭小.由于是刚来,我也不好要求太多.但就这个小房间 ...
- Python图像处理库Pillow常用使用方法
PIL(Python Imaging Library)是Python一个强大方便的图像处理库,只支持到Python2.7.Pillow是PIL的一个派生分支,在Python3中用Pillow代替PIL ...
- ABP进阶教程0 - 目录
ABP进阶教程 本教程主要讲解如何基于ABP实现条件查询/分页/排序/导出/打印等功能. 源码已分享: GitHub Gitee ABP进阶教程0 - 目录 ABP进阶教程1 - 条件查询 A ...
- JAVA中this和super用法
参考网上资料和自行理解总结java中this和super中各自用法及其差异 <一>. this的用法 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器返回该类的对 ...
- hbase相关操作
hbase安装 下载 wget http://apache.gree.com/apache/hbase/hbase-1.2.11/hbase-1.2.11-bin.tar.gz tar -zxvf b ...
- Linux文件基本命令
Linux文件基本命令学习 操作技巧: 输入文件/目录/命令的前几个字母之后,按下tab键,则自动补全 按上/下,回滚曾经用过的命令 不想执行命令使用:crtl + c 基础命令: ls(查看) 基础 ...
- python使用face_recognition包的环境设置
在使用face_recognition包进行人脸识别时,环境是非常重要的,但是网上办法特别纷杂,今天介绍一种特别简单的办法,希望能帮助到大家,少走些坑. 1.首先应该下载dlib安装包(例如:dlib ...
- v-bind是是否需要绑定某一个类名
v-bind 结合 css样式 结合标签显示是否要显示出某个样式 <p :class="['bg','dx', {'lin':falg}]">{{ msg }}< ...
- JWT签名算法中HS256和RS256有什么区别 转载
JWT签名算法中,一般有两个选择,一个采用HS256,另外一个就是采用RS256. 签名实际上是一个加密的过程,生成一段标识(也是JWT的一部分)作为接收方验证信息是否被篡改的依据. RS256 (采 ...