目录

1 五种基本数据对象

2 数据结构对象分析

2.1 类型

2.2 编码与底层实现

2.3 编码转换


1 五种基本数据对象

图1 redis数据对象

2 数据结构对象分析

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

redis.h

typedef struct redisObject {//类型unsigned type:4;unsigned notused:2; //编码unsigned encoding:4;unsigned lru:22; //引用计数int refcount;//指向底层实现数据结构的指针void *ptr;
} robj;

 2.1 类型

对象的type属性记录了对象的类型,这个属性的值可以是表2-1列出对的常量中的一个。

表2-1 不同类型值对象的TYPE命令输出
对象 对象type属性的值 TYPE命令的输出
字符串对象 REDIS_STRING string
列表对象 REDIS_LIST list
哈希对象 REDIS_HASH hash
集合对象 REDIS_SET set
有序集合对象 REDIS_ZSET zset

TYPE命令的实现方式也与此类似,当我们对一个数据库键执行TYPE命令时,命令返回的结果为数据库键对应的值对象类型,而不是键对象类型:

# 键为字符串对象,值为字符串对象
127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> TYPE msg
string
# 键为字符串对象,值为列表对象
127.0.0.1:6379> RPUSH numbers 1 3 5
(integer) 3
127.0.0.1:6379> TYPE numbers
list
# 键为字符串对象,值为哈希对象
127.0.0.1:6379> HMSET profile name Tome age 25 career Programmer
OK
127.0.0.1:6379> TYPE profile
hash
# 键为字符串对象,值为集合对象
127.0.0.1:6379> SADD fruits apple banana cherry
(integer) 3
127.0.0.1:6379> TYPE fruits
set
# 键为字符串对象,值为有序集合对象
127.0.0.1:6379> ZADD price 8.5 apple 5.0 banana 6.0 cherry
(integer) 3
127.0.0.1:6379> TYPE price
zset

2.2 编码与底层实现

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。encoding属性记录了对象使用的编码,也即是说这个对象使用了什么数据结构作为对象的底层实现,这个属性的值可以是表2-2列出的常量的其中一个。

表2-2 OBJECT ENCODING对不同编码的输出
对象所使用的底层数据结构 编码常量 OBJECT ENCODING命令输出
整数 REDIS_ENCODING_INT int
embstr编码的简单动态字符串(SDS) REDIS_ENCODING_EMBSTR embstr
简单动态字符串 REDIS_ENCODING_RAW raw
字典 REDIS_ENCODING_HT hashtable
双端链表 REDIS_ENCODING_LINKEDLIST linkedlist
压缩列表 REDIS_ENCODING_ZIPLIST ziplist
整数集合 REDIS_ENCODING_INTSET intset
跳跃表和字典 REDIS_ENCODING_SKIPLIST skiplist

使用OBJECT ENCODING命令可以查看一个数据库键的值对象的编码:

127.0.0.1:6379> SET msg "hello wrold"
OK
127.0.0.1:6379> OBJECT ENCODING msg
"embstr"
127.0.0.1:6379> SADD numbers 1 3 5
(integer) 3
127.0.0.1:6379> OBJECT ENCODING numbers
"intset"
127.0.0.1:6379> SADD numbers "seven"
(integer) 1
127.0.0.1:6379> OBJECT ENCODING numbers
"hashtable"

每种类型的对象都至少使用了两种不同的编码,表2-3列出了每种类型的对象可以使用的编码:

表2-3 不同类型和编码的对象
类型 编码 对象
REDIS_STRING REDIS_ENCODING_INT 使用整数值实现的字符串对象
REDIS_STRING REDIS_ENCODING_EMBSTR 使用embstr编码的简单动态字符串实现的字符串对象
REDIS_STRING REDIS_ENCODING_RAW 使用简单动态字符串实现的字符串对象
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表对象
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表实现的列表对象
REDIS_HASH REDIS_ENCODING_ZIPLIST 使用压缩列表实现的哈希对象
REDIS_HASH REDIS_ENCODING_HT 使用字典实现的哈希对象
REDIS_SET REDIS_ENCODING_INTSET 使用整数集合实现的集合对象
REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象
REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用压缩列表实现的有序集合对象
REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳跃表和字典实现的有序集合对象

2.3 编码转换

(1)字符串对象

  • 对于int编码的字符串对象来说,如果我们向对象执行了一些命令,使得对象保存的不再是整数值,而是一个字符串值,那么字符串对象将从int变为raw。
  • 对embstr编码的字符串对象执行任何修改命令时,程序先将对象的编码从embstr转换成raw,然后再执行修改命令。

(2)列表对象

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

  • 列表对象保存的所有字符串元素的长度都小于64字节
  • 列表对象保存的元素数量小于512个

(3)哈希对象

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

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

(4)集合对象

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

  • 集合对象保存的所有元素都是整数值
  • 集合对象保存的元素数量不超过512个

(5)有序集合

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

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

参考:

1、redis设计与实现(第二版)

Redis教程:数据对象分析(一)相关推荐

  1. erp物料报废 oracle_ERP核心业务流程和Oracle-ERP业务和数据对象分析

    作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践 今天简单整理下原来整理过的ERP核心业务流程和Oracle-ERP核心业务功能和数据对象分 ...

  2. 简述oracle的主要数据库对象,Oracle数据库数据对象分析

    Oracle数据库数据对象分析 Oracle数据库数据对象中最基本的是表和视图,其他还有约束.序列.函数.存储过程.包.触发器等.对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数 ...

  3. ERP核心业务流程和Oracle-ERP业务和数据对象分析

    ERP核心业务流程和Oracle-ERP业务和数据对象分析 https://www.toutiao.com/i6869658665129869832/?tt_from=weixin&utm_c ...

  4. Redis教程:数据对象分析(二)

    目录 1 类型检查与命令多态 2 内存回收 3 对象共享 4 对象的时转时长 1 类型检查与命令多态 Redis中用于操作键的命令基本上可以分为两种类型:其中一种命令可以对任何类型的键执行,比如DEL ...

  5. Redis教程:常见问题分析

    1.redis的优势? 性能很好 支持事务 支持丰富的数据类型 支持数据持久化 2.redis为什么这么快? 纯内存操作 单线程操作,避免了频繁的上下文切换 采用了非阻塞I/O多路复用机制 图1 re ...

  6. redis lettuce 超时_Spring Cache 操作 Redis 实现数据缓存(上)

    点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:http://www.mydlq.club/article/55/ . 一.缓存概念知识 . 1.是什么缓存 . ...

  7. SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/55/ 系统 ...

  8. redis集合数据过期_关于redis性能问题分析和优化

    一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...

  9. python金融量化书籍_超强干货 | Python金融数据量化分析教程+机器学习电子书

    如今Python语言的学习已经上升到了国家战略的层面上.Python语言是人工智能的基础语言,国家相关教育部门对于"人工智能普及"格外重视,不仅将Python列入到小学.中学和高中 ...

最新文章

  1. Linux常用性能检测命令
  2. 动态加载子节点_微信小游戏开发之场景切换和常驻节点传递数据
  3. 状态机系列学习笔记01
  4. 设置居中_微信设置个性签名居中,超简单!
  5. 计算机e盘拒绝访问,电脑中的D盘与E盘拒绝访问是为什么?
  6. key map 模糊查找_lua脚本语言批量删除模糊查询的key
  7. java B2B2C 仿淘宝电子商城系统-eureka 基础
  8. vijos1364:Likecloud-吃吃吃
  9. 笔记3:Tensorflow2.0实战之MNSIT数据集
  10. RecyclerView的基础用法
  11. Unix/Linux环境C编程新手教程(40) 初识文件操作
  12. 新版 世界地图 中文版地图 国界地图 高清全彩矢量地图 CDR 2021年整理制作
  13. MyBatis中foreach传入参数为Poji装饰类,list、数组的不同写法
  14. JDK源码阅读计划(Day12) BitSet
  15. 中控考勤机Java二次开发(附Demo)
  16. 用辩证数学解答“缸中之脑”
  17. C++ Concurrency in Action 2nd Edition
  18. wepy(minUI)框架学习
  19. 高通平台音频软件架构
  20. 专为医疗领域打造!飞凌嵌入式新一代FDU显控一体机发布

热门文章

  1. mysql开发平台_搭建mysql编程平台
  2. 老鸟的Python新手教程
  3. antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
  4. 计算机类实训室建设公司,计算机专业实训室建设方案修改
  5. 强大的日志分析工具AWStats经典备忘
  6. 注册app短信验证平台_怎样挑选网站验证码短信平台?
  7. 请用旧版的 Scala-2.11 搭配 Spark-2.4.8 / hadoop-2.7
  8. 荔枝糖FPGA开发板相关博客
  9. strongswan 配置文件 /etc/ipsec.conf 速查手册1
  10. html页面div高度相减,关于html:两个div底部div到高度调整与浏览器窗口