简介: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的对象的更多相关文章

  1. redis object 对象系统

    redis object对象系统 概述 redis 当中, sds字符串, adlist双向链表, dict字典, ziplist压缩链表, intset整数集合等均为底层数据结构 redis 并没有 ...

  2. redis存储对象

      redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列 ...

  3. redis存储对象与对象序列化详解

    redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis存储对象序列化和反序列化 首先来了解一下为什么要实现序列化 为什么要实现序列化接 ...

  4. Redis | 使用redis存储对象反序列化异常SerializationFailedException

    案例 使用Redis进行对象存储,在处理业务逻辑的时候,丛Redis获取对象发现反序列化失败,抛出如下异常: Caused by: org.springframework.data.redis.ser ...

  5. 深入了解Redis(3)-对象

    Redis主要的数据结构有简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合,等等.但Redis并没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个 ...

  6. Redis 存储对象信息是用 Hash 还是 String

    Redis 内部使用一个 RedisObject 对象来表示所有的 key 和 value,RedisObject 中的 type,则是代表一个 value 对象具体是何种数据类型,它包含字符串(St ...

  7. 高性能的Redis之对象底层实现原理详解

    对象 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合, 等等. Redis 并没有直接使用这些数据结构来实 ...

  8. redis存储对象,实体类新加字段空指针问题处理

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  9. redis存取对象

    redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis不能直接存取对象,如何解决呢? 两种方式 1.利用序列化和反序列化的方式 两层对 ...

随机推荐

  1. E203 CSR寄存器

    RiscV架构则定义了一些控制和状态寄存器(CSR),用于配置或记录一些运行的状态.CSR寄存器是处理器内核内部的寄存器,使用专有的12位地址编码空间,对一个hart,可以配置4k的CSR寄存器. 蜂 ...

  2. Dynamics CRM 2015/2016新特性之三十二:新增乐观并发处理

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复215或者20160328可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  3. Python 字符串用法总结

    一.将某个对象转换为字符串,有str()和repr()两种方法 区别:repr() 转化为供解释器读取的形式str() 转化为适于人阅读的形式 a = 123456 print('repr输出:', ...

  4. 【JavaWeb】JSON基础

    JSON JavaScript Object Notation(JavaScript 对象表示法): JSON是轻量级的文本数据交换格式: JSON独立于语言,具有自我描述性,更易理解: JSON语法 ...

  5. win10输入法问题,已禁止IME 问题解决

    第一种较为简单的解决方法: windows+R打开「运行」,然后打ctfmon,确定. 另外一种解法: windows的老bug了解决办法: 1. I. WIN + X 打开控制面板 -> 管理 ...

  6. 博客美化——Silence主题皮肤

    介绍   一款专注阅读的博客园主题,主要面向于经常混迹 博客园 的朋友.其追求大道至简的终极真理,界面追求简洁.运行追求高效.部署追求简单. 博客皮肤源码地址 预览地址 如何部署.使用皮肤 Silen ...

  7. slot 的简单使用(一)匿名插槽

    slot 是父组件与子组件的通选方式可以将父组件的内容显示在子组件当中或者说可以将 让你封装的组件变的更加的灵活,强壮! 组件 slot-exmple.vue <template> < ...

  8. JS高阶---线程与事件机制(小结)

    [大纲] [主体] 注意:先进先出 事件轮询: 事件初始化代码执行完毕后,开始执行事件队列里的待处理事件 .

  9. luoguP2486 [SDOI2011]染色

    题目 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段) ...

  10. Html学习之八(CSS选择器的使用--属性选择器)

    一.前缀属性选择器 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...