Redis - 数据类型映射底层结构
简介
从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同。

字符串对象
字符串对象的编码可以是 int、raw 和 embstr 三者之一。
embstr 编码是专门用于保存简短字符串的一种优化编码方式,与 raw 编码会调用两次内存分配函数分别创建 redisObject 结构和 sdshdr 结构不同,embstr 只会使用一次内存分配函数创建一块连续的内存空间同时存放 redisObject 结构和 sdshdr 结构。
字符串转换编码的条件如下:
- 如果字符串对象存储的是整数值并且不超过
long的范围时,优先选择使用int作为编码方式 - 如果存储的字符串长度大于 32 个字节,会使用
raw编码的简单动态字符串作为保存 - 如果存储的字符串长度小于 32 个字节,会使用
embstr编码的简单动态字符串作为保存
字符串对象中有两个需要注意的地方:
- 对于存储浮点数的字符串对象,实际上这个浮点数是以字符串值来保存的,执行如
INCRBYFLOAT这样的命令时,Redis 会先将字符串转换成浮点数计算,然后再转换成字符串值存储 int编码和embstr编码在条件满足下会转换成raw编码。embstr在执行修改命令之后总是会转换成raw编码,这个过程是不可逆的
列表对象
在 3.2 版本之前,列表对象的编码可以是 ziplist 或者 zlinkedlist 的其中一个;在 3.2 版本之后,列表对象的编码只能是 quicklist。
哈希对象
哈希对象的编码可以是 ziplist 或者 hashtable 中的一个。
哈希对象使用 ziplist 作为底层实现的时候,每当有新的键值对要插入哈希对象时,Redis 会先保存键的压缩列表节点到压缩列表的表尾,然后再保存值的压缩列表节点到压缩列表的表尾。
当哈希对象同时满足以下两个条件时,哈希对象使用 ziplist 编码:
- 哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节
- 哈希对象保存的键值对数量小于 512 个
集合对象
集合对象的编码可以是 intset 或者 hashtable 中的一个。
hashtable 编码的集合对象使用字典作为底层实现,字典的每个键都是字符串对象,这个字符串对象包含着集合元素,字典的每个值都直接存储 NULL。
当集合对象同时满足以下两个条件时,集合对象使用 intset 编码:
- 集合对象保存的所有元素都是整数值
- 集合对象保存的元素数据不超过 512 个
有序集合对象
有序集合对象的编码可以是 ziplist 或者 skiplist 中的一个。
有序集合对象使用 ziplist 编码作为底层实现时,每个集合对象会使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素则保存元素的分值。
这里有一点需要注意,skiplist 编码的有序集合使用 zset 结构作为底层实现,一个 zset 结构包含一个字典和一个跳表。其中字典的键保存元素的成员,字典的值保存元素的分值;跳表的 object 属性保存元素的成员,跳表的 score 属性保存元素的分值。
理论上有序集合可以只使用字典或者跳表实现,但是使用两个结构冗余存储有序集合对象的成员和分值,既保留了字典 O(1) 时间复杂度查找的效率,也保留了跳表范围型操作的所有优点。
当同时满足以下两个条件时,有序集合会使用 ziplist 编码:
- 有序集合保存的元素数量小于 128 个
- 有序集合保存的所有元素成员的长度都小于 64 字节
相关文章:
Redis - 数据类型映射底层结构
简介 从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同。 字符串对象 字符串对象的编码可以是 int、raw 和 embstr 三者之一。 embstr 编码是专门用于保存简短字符串的一种优化编…...
MySQL数据库表的增删查改 - 进阶
一,数据库约束 1.1 约束对象 not null - 该列不能为空unique - 保证该列的每一行都不一样default - 规定没有给列赋值时的默认值(自定义)primary key - not null 和 unique 的结合,会给该列添加一个索引࿰…...
8086汇编语言工作环境 百度网盘下载
链接:https://pan.baidu.com/s/1-1K7gX859xejaUK70OTgtw?pwdbfa5 提取码:bfa5 为了方便下载,找了很多资料,也是从其他人那边分享过来的,也方便其他人 文件内容:...
ES6 解构
解构的语法 … {} 解构的语法中,...(展开运算符)和 {}(对象字面量)扮演着不同的角色。 ...(展开运算符): 在解构中,... 被用作展开运算符,用于将数组或对象中…...
React三个状态时触发的相应钩子
01.初始化状态。 这个阶段由render()函数触发; 1.constructor(); 2.componentWillMount(); 在17版本以后改为UNSAFE_componentWillMount() reason:react为组件异步渲染做准备; 3.render(); 4.componentDidMount(); 这…...
阿里云服务器部署Drupal网站教程基于CentOS系统
阿里云百科分享如何在CentOS 7操作系统的ECS实例上搭建Drupal电子商务网站。Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。它用于…...
【广州华锐视点】VR燃气轮机故障判断模拟演练系统
VR燃气轮机故障判断模拟演练系统由广州华锐视点开发,是一款基于虚拟现实技术的教育工具,旨在为学生提供一个安全、高效、互动的学习环境,帮助他们更好地掌握燃气轮机的故障诊断技能。 这款VR实训软件能够模拟真实的燃气轮机故障诊断场景&…...
第01天 什么是CSRF ?
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 每天一个知识点 ✨特色专栏࿱…...
uniapp 自定义手机顶部状态栏不生效问题
想要的效果想淘宝一样,底色覆盖到手机顶部,找了两天都没找到原因,过程很艰苦,直接上结果吧 项目是后来接手的,最终原因出在这, "immersed" : false>设置为 true 就可以了,沉浸式样…...
C++语法中bitset位图介绍及模拟实现
一、位图的引入 先来看下边一道面试题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 经过我们之前的学习,我们可能会有以下的思路: 对这些数进行排序ÿ…...
Debezium系列之:深入理解消息过滤,实现过滤数据库删除事件,只采集数据库新增和更新事件
Debezium系列之:深入理解消息过滤,实现过滤数据库删除事件,只采集数据库新增和更新事件 一、需求背景二、相关技术三、部署相关jar包四、参数详解五、总结一、需求背景 使用Debezium采集数据库数据,现在部分表只想采集新增数据和更新数据二、相关技术 实现这个需求的技术可…...
Substack 如何在去中心化内容创作领域掀起波澜
面对数字内容广告化的困境,Substack回归做内容的初心,通过产品和平台双轮驱动,重塑一个去中心化的多元文化内容聚集地,实现了增长突破。其核心策略在于先使用简洁的创作工具赋能内容生产,进而通过平台的互动机制促进用…...
【MFC】07.MFC六大机制:消息映射-笔记
本专栏上两篇文章分别介绍了【MFC】05.MFC第一大机制:程序启动机制和【MFC】06.MFC第二大机制:窗口创建机制,这篇文章来为大家介绍MFC的第三大机制:消息映射 typfd要实现消息映射,必须满足的三个条件: 类必…...
python操作数据库
python操作数据库 首先安装数据插件 pip install pymysqlfrom pymysql import Connection # 引入数据库第三方包# 创建链接 conn Connection(host"localhost", # 主机名ipport3306,user"root",# 用户名password"123456" # 密码 )print(con…...
【C语言】小游戏-三字棋
大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑随机下棋 6.判断输赢 7.判断棋盘是否满了 四、完整代码 game.h(相关函数的声明,整个代码要引用的头文件以及宏…...
多线程与并发编程面试题总结
多线程与并发编程 多线程 线程和进程的区别? 从操作系统层面上来讲:进程(process)在计算机里有单独的地址空间,而线程只有单独的堆栈和局部内存空间,线程之间是共享地址空间的,正是由于这个特性,对于同…...
在多页面应用和单页面应用中(例如vue)怎么提高seo搜索引擎优化
那么 我们要先知道 搜索引擎是怎么工作的? 搜索引擎是通过一系列步骤来工作的,以下是其基本原理: 1、网络爬虫:搜索引擎使用网络爬虫(也称为蜘蛛、机器人)来从互联网上抓取网页。网络爬虫按照预定义的规则…...
Dubbo 2.7.0 CompletableFuture 异步
了解Java中Future演进历史的同学应该知道,Dubbo 2.6.x及之前版本中使用的Future是在java 5中引入的,所以存在以上一些功能设计上的问题,而在java 8中引入的CompletableFuture进一步丰富了Future接口,很好的解决了这些问题。 Dubb…...
pytest-xdist分布式测试原理浅析
目录 pytest-xdist执行流程: pytest-xdist 模块结构: pytest-xdist分布式测试原理: pytest-xdist源码浅读: pytest-xdist执行流程: 解析命令行参数:pytest-xdist 会解析命令行参数,获取用户…...
研发工程师玩转Kubernetes——PVC通过storageClassName进行延迟绑定
不同的PV可以使用相同的StorageClass,它们是一对多的关系。 PV可以设置节点亲和性。比如下图,local-storage-class-waitforfirstconsumer-pv-ubuntuc只能在节点ubuntuc上;local-storage-class-waitforfirstconsumer-pv-ubuntud只能在节点ubu…...
【Dify插件开发黄金法则】:20年AI平台架构师亲授,从零构建可商用插件的5大核心步骤
第一章:Dify插件开发的底层逻辑与商业价值认知 Dify 插件系统并非简单的功能扩展接口,而是基于 LLM 应用编排范式重构的服务集成层。其底层依托于 OpenAPI 3.0 规范自动解析与运行时 Schema 校验机制,所有插件必须提供符合标准的 openapi.ya…...
春秋云境CVE-2021-42013
1.阅读靶场介绍 这里主要是得到路径穿越和命令执行 这两个关键字眼 这里说点博主打靶场的心得 就是首先是根据靶场介绍我们会得到大致方向 如果打不出来的话我们可以去找度娘 再然后就是去把介绍的文字喂给ai看看ai给到什么建议 最后就是找github看看有没有了 如果都没有…...
Nginx配置踩坑实录:从403 Forbidden到优雅重定向,我的半天调试经历
Nginx配置踩坑实录:从403 Forbidden到优雅重定向的调试之旅 那天下午的阳光透过窗户斜射进来,我正对着屏幕上那个刺眼的403 Forbidden错误发呆。这已经是第三次部署Vue项目时遇到这个问题了——明明本地开发环境一切正常,为什么一到Nginx就频…...
VS2019下OpenCV C++环境配置保姆级教程(附4.4.0版本动态库文件清单)
VS2019与OpenCV C环境配置:从避坑到精通的完整指南 在计算机视觉开发领域,OpenCV无疑是最受欢迎的库之一。然而对于刚接触C开发的初学者来说,配置开发环境往往成为第一道门槛。本文将深入剖析VS2019下OpenCV C环境配置的关键细节,…...
当PM凌晨提需求时,我的自动化回复机器人亮了:一名测试工程师的“静默”反击与效能革命
深夜,手机屏幕的冷光骤然亮起,一条来自产品经理(PM)的即时消息弹窗,像一枚投入平静湖面的石子,精准地击碎了凌晨两点钟的睡眠。消息简洁,甚至带着一丝不容置疑的“理所应当”:“紧急…...
保姆级教程:在Ubuntu 20.04上搞定GAMIT/GLOBK 10.7安装(含gfortran版本避坑指南)
保姆级教程:在Ubuntu 20.04上搞定GAMIT/GLOBK 10.7安装(含gfortran版本避坑指南) 如果你正在Ubuntu 20.04上尝试安装GAMIT/GLOBK 10.7,却因为各种依赖问题和版本冲突而头疼不已,那么这篇教程就是为你准备的。作为一款强…...
从裸屏到显示“Hello World”:我的STM32F103RFT6驱动1.3寸LCD全记录(附PCB设计)
从零点亮1.3寸LCD:STM32F103RFT6驱动ST7789全流程实战 记得第一次拿到那块1.3寸的裸屏时,我盯着24个引脚发呆——没有现成的底板,没有即插即用的排针,只有一份全英文的datasheet。作为嵌入式开发者,这种从零开始的硬件…...
Android App想跑AI模型?试试用Chaquopy把Python 3.9环境打包进去
Android应用集成Python AI实战:用Chaquopy打造移动端智能引擎 当我们在咖啡馆用手机拍照时,那个自动识别咖啡种类的AR特效;当健身APP实时分析我们的运动姿态时,那些精准的关节标记点——这些让人眼前一亮的移动端AI功能࿰…...
解决Raspberry Pi上的jInput库问题
引言 在使用Java开发跨平台的应用程序时,处理不同操作系统下的库文件加载问题是一个常见的挑战。尤其是在Raspberry Pi(Pi3B+)上运行时,jInput库的加载问题可能会困扰不少开发者。本文将通过一个实例,详细介绍如何解决在Raspbian64系统上jInput库加载失败的问题。 问题描…...
超越心跳包:5种防止SSH断连的奇技淫巧,从tmux到Mosh全攻略
超越心跳包:5种防止SSH断连的奇技淫巧,从tmux到Mosh全攻略 每次跨国视频会议卡成PPT时,我总想起那些年在哈萨克斯坦油田调试设备的经历——卫星网络延迟高达800ms,SSH连接平均存活时间不超过3分钟。传统的心跳包配置在这种极端环境…...
