「Redis数据结构」RedisObject

news2024/11/18 22:53:55

「Redis数据结构」RedisObject

文章目录

  • 「Redis数据结构」RedisObject
    • 一、概述
    • 二、结构
    • 三、编码方式
    • 四、小结
    • 五、参考

一、概述

redisObject对象非常重要,Redis对象的类型内部编码内存回收共享对象等功能,都需要redisObject支持。

redis 不是一个普通的 key-value存储器,其中 key 类型一般为字符串,而 value 类型则为 redis 对象(redis object)redis 对象可以绑定各种类型的数据,如 string、list 和 set等等。


二、结构

RedisObject

  • 使用者的角度来看,⼀个Redis节点包含多个database(非cluster模式下默认是16个,cluster模式下只能是1个),而一个database维护了从key space到object space的映射关系。这个映射关系的key是string类型,⽽value可以是多种数据类型,比如:string, list, hash、set、sorted set等。我们可以看到,key的类型固定是string,而value可能的类型是多个。
  • Redis内部实现的⾓度来看,database内的这个映射关系是用⼀个dict来维护的。dict的key固定用⼀种数据结构来表达就够了,这就是动态字符串sds。而value则比较复杂,为了在同⼀个dict内能够存储不同类型的value,这就需要⼀个通⽤的数据结构,这个通用的数据结构就是robj,全名是redisObject。

image-20221205012924009


三、编码方式

对象的 ptr 指针指向对象的底层实现数据结构, 而这些数据结构由对象的 encoding 属性决定。

encoding 属性记录了对象所使用的编码, 也即是说这个对象使用了什么数据结构作为对象的底层实现

Redis中会根据存储的数据类型不同,选择不同的编码方式,共包含11种不同类型:

编号编码方式说明
0OBJ_ENCODING_RAWraw编码动态字符串
1OBJ_ENCODING_INTlong类型的整数的字符串
2OBJ_ENCODING_HThash表(字典dict)
3OBJ_ENCODING_ZIPMAP已废弃
4OBJ_ENCODING_LINKEDLIST双端链表
5OBJ_ENCODING_ZIPLIST压缩列表
6OBJ_ENCODING_INTSET整数集合
7OBJ_ENCODING_SKIPLIST跳表
8OBJ_ENCODING_EMBSTRembstr的动态字符串
9OBJ_ENCODING_QUICKLIST快速列表
10OBJ_ENCODING_STREAMStream流

每种类型的对象都至少使用了两种不同的编码

类型编码对象
REDIS_STRINGREDIS_ENCODING_INT使用整数值实现的字符串对象。
REDIS_STRINGREDIS_ENCODING_EMBSTR使用 embstr 编码的简单动态字符串实现的字符串对象。
REDIS_STRINGREDIS_ENCODING_RAW使用简单动态字符串实现的字符串对象。
REDIS_LISTREDIS_ENCODING_ZIPLIST使用压缩列表实现的列表对象。
REDIS_LISTREDIS_ENCODING_LINKEDLIST使用双端链表实现的列表对象。
REDIS_HASHREDIS_ENCODING_ZIPLIST使用压缩列表实现的哈希对象。
REDIS_HASHREDIS_ENCODING_HT使用字典实现的哈希对象。
REDIS_SETREDIS_ENCODING_INTSET使用整数集合实现的集合对象。
REDIS_SETREDIS_ENCODING_HT使用字典实现的集合对象。
REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表实现的有序集合对象。
REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象。

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

redis> SET msg "hello wrold"
OK

redis> OBJECT ENCODING msg
"embstr"

redis> SET story "long long long long long long ago ..."
OK

redis> OBJECT ENCODING story
"raw"

redis> SADD numbers 1 3 5
(integer) 3

redis> OBJECT ENCODING numbers
"intset"

redis> SADD numbers "seven"
(integer) 1

redis> OBJECT ENCODING numbers
"hashtable"

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"

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

举个例子, 在列表对象包含的元素比较少时, Redis 使用压缩列表作为列表对象的底层实现:

  • 因为压缩列表比双端链表更节约内存, 并且在元素数量较少时, 在内存中以连续块方式保存的压缩列表比起双端链表可以更快被载入到缓存中;
  • 随着列表对象包含的元素越来越多, 使用压缩列表来保存元素的优势逐渐消失时, 对象就会将底层实现从压缩列表转向功能更强、也更适合保存大量元素的双端链表上面;

其他类型的对象也会通过使用多种不同的编码来进行类似的优化。


四、小结

  • redisObjec是联结两个层面的数据结构的桥梁。
  • 为多种数据类型提供一种统一的表示方式。
  • 允许同一类型的数据采用不同的内部表示,从而在某些情况下尽量节省内存。
  • 支持对象共享和引用计数。当对象被共享的时候,只占用一份内存拷贝,进一步节省内存。

五、参考

对象的类型与编码

redisObject详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DPDK EAL

DPDK全程是Intel Data Plane Development Kit,是一个数据平面开发集。 DPDK的主要思想 绕过内核,实现Zero Copy使用UIO驱动屏蔽硬中断,并采用PMD主动轮询,减少Cache Miss和切换上下文的开销使用大页内存,减少TLB Mis…

重磅:Docker Desktop正式集成WasmEdge。后者首登GitHubTrending

上周五,Docker Desktop 发布了 4.15 新版本。在这个版本中,Docker Desktop 正式集成了 WasmEdge 的 containerd shim, 并且 Docker Wasm 也从 tech preview 进入到了 beta 阶段。这意味着,1000 万 Docker Desktop 的用户都安装了…

代码安全与质量 | 在这个充满变数的时代,花小钱办大事

在这个充满变数的时代,许多企业都想要提升效率,但如何以同样的时间、人力成本创造出更大的价值?在研发领域,企业选择引入更好的工具来帮助交付高质量代码,比如Sonar,帮助团队充分利用时间,专注于…

Gradle 使用maven本地仓库 带来的思考

Gradle 使用maven本地仓库 带来的思考 本篇主要探究一下 在使用Gradle 的时候一般会配置 maven 的本地仓库的,那是不是Gradle 可以直接使用 maven本地仓库的jar呢 ? 下面来探究一下 思考 当我们在使用Gradle的时候 一配置一个 mavenLocal() 代表它会使用maven的本地仓库, 此时…

独立产品灵感周刊 DecoHack #040 - Google公布2022年度最佳应用榜单

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。💻 产品推荐 1. Sensei 这是一…

408真题-2021

死去的记忆正在攻击我: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n7aXxWnx-1670222893563)(https://waite1-1307752947.cos.ap-nanjing.myqcloud.com/img/202212051447504.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保…

网络编程之NIO 基础

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 st…

数据结构与算法之Python实现——栈

在常用的数据结构中,有一批结构被称为容器——栈与队列。 本篇博客主要学习一下栈这种结构的特性,以及用python实现它的相关操作。 内容 顺序栈链栈栈的实际应用 在这之前,我们需要了解一下什么是栈,以及栈这种结构有什么用处&am…

HarmonyOS/OpenHarmony应用开发-DataAbility开发体验

场景介绍 基于Data模板的Ability(以下简称“Data”),有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。 Dat…

使用vuedraggable实现拖拽式操作实战

背景 先说下需求,为了提升开发效率和降低开发成本和技术难度,采用低代码方式,通过配置来生成代码,算是代码生成器的升级版解决方案。 对于前端页面,某个业务实体,如系统参数,常见的菜单对应一…

Memcached 未授权访问漏洞验证

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。 该服务的端号为:11211 使用绿盟漏洞扫描系统发现某服务器存在Memcached 未授权访问漏洞,如下图所示。 验证方法一: 使用nmap 脚本script-…

ADSP-21489的开发详解:Norflash的编程和烧写

编者的话 Flash 编程与烧写,原本应该是开发的最后一步,当所有程序都做好了,在线编译运行正常,才会通过 Flash 编程,生成二进制的可执行文件 LDR,再通过 JTAG 仿真器将 LDR 文件烧写到 Flash 中&#xff0c…

初探 Vue3 新特性

在本讲中,我们只会概述性的来介绍一下 Vue3 中新增的一些主要内容,而这些主要知识点的详细的使用和功能以及作用,我们会在后面的课程里面逐渐的给大家去解锁。那么明确好了我们的学习目标之后呢? 我们来看一下 Vue3 之中到底新增…

Docker---Docker-compose 安装部署 zentao 禅道

Docker-compose 安装部署 zentao 禅道 目录Docker-compose 安装部署 zentao 禅道一、环境准备1.更换国内源2.拉取zentao的docker镜像3.关闭防火墙4.安装启动docker、docker-compose二、通过yml文件进行部署一、环境准备 1.更换国内源 CentOS7 Base源: wget -O /et…

技术男的春天:小姐姐求助暖男分析

时光荏苒,这个故事发生在4年前,那时候我头发可真厚,坐地铁也不用戴口罩。 小姐姐求助 友圈一位要做毕设的小姐姐在求助postman怎么用,我就帮她解答了一下。 我知道她并非计算机相关专业,所以很奇怪为什么要用postma…

web安全渗透

自己模拟的环境,要的私信 Web安全渗透 1、通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为flag值提交; 修改源码maxlength对应的数值,3+16=19输出的数值是两位数,然后修改完之输入

HTML+CSS+JS网页设计期末课程大作业—— 绿色化妆品HTML+CSS+JavaScript

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Windows搭建web站点:为站点配置二级子域名 2-2

在上一篇文章《Windows搭建Web站点:免费内网穿透发布至公网 1/2》中,我们成功通过cpolar将内网web站点发布到公网可访问,但免费使用cpolar所生成的域名是随机变化的(24小时后会变化),这只适合临时测试使用。…

Mysql SQL优化跟踪来看看是如何优化并决策使用哪个索引或者不适用索引

背景 使用索引字段进行筛选数据时,explain查询语句发现MySQL居然没有使用索引,产生疑问,因此决定调查清楚为什么会不用索引,而是走全表扫描 原因调查出的结果是当你要查询的数据量是连续又占整个表五分之一以上那就不会走索引了&a…

Java面试宝典.exe程序成功运行,经典 Java 万字笔记,查漏补缺,备战跳槽面试

现在 java 的面试真的卷到家了,面试前很有必要针对性的多刷题,大部分童鞋实战能力强,理论不行,面试前不做准备很吃亏。这里整理了很多常考面试题,希望对你有帮助。 耗时一个月,我把牛客网上最火的 Java 面…