Redis之string类型的三大编码解读

2023-11-14

目录

string类型的三大编码

int 编码

embstr 编码

raw 编码

明明没有超过阈值,为什么变成raw?

查看数据类型相关命令 

redis看看类型:type key

看看编码:object encoding 

debug结构:debug object person 


在 Redis 中,String 类型的数据结构并不是采用 C 语言中自带的字符串类型,C 语言中的数据结构存在很多问题,比如:

  • 获取字符串长度的需要通过运算

  • 非二进制安全

  • 不可修改

因此,String 在 Redis 中有其他三种编码方式: int、embstr、raw 。其中, raw 和 embstr 类型,都是基于动态字符串(SDS)实现的

string类型的三大编码

对于不同的对象,Redis会使用不同的类型来存储。对于同一种类型type会有不同的存储形式encoding。对于string类型的字符串,其底层编码方式共有三种,分别为int、embstr和raw。

int 编码

当存储的值为整数,且值的大小可以用 long 类型表示时,Redis 使用 int 编码。在 int 编码中,String 对象的实际值会被存储在一个 long 类型的整数中。这种编码方式的优点是存储空间小,且无需进行额外的解码操作。( 只有整数才会使用int,如果是浮点数, Redis内部其实先将浮点数转化为字符串值,然后再保存)

命令示例: set k1 123

Redis启动时会预先建立10000个分别存储0 - 9999的redisObject变量作为共享对象,这就意味着如果set字符串的键值在0~10000之间的话,则可以直接指向共享对象而不需要再建立新对象,此时键值不占空间 

embstr 编码

当存储的值为字符串,且长度大于 44 字节时,Redis 使用 embstr 编码。在 embstr 编码中,String 对象的实际值会被存储在一个特殊的字符串对象中,该对象包含了字符串的长度和字符数组的指针,但是不包含额外的空间。这种编码方式的优点是存储空间小,且无需进行额外的解码操作,但是由于需要额外的内存分配,可能会影响性能。

EMBSTR顾名思义即:embedded string,表示嵌入式的String。从内存结构上来讲即字符串sds结构体与其对应的 redisObject对象分配在同一块连续的内存空间,字符串sds嵌入在redisObject对象之中一样

raw 编码

当存储的值为字符串,且长度小于等于 44 字节时,Redis 使用 raw 编码。在 raw 编码中,String 对象的实际值会被存储在一个简单的字符串对象中,该对象包含了字符串的长度和字符数组的指针。这种编码方式的优点是存储空间小,且无需进行额外的解码操作。

 这与OBJ_ENCODING_EMBSTR编码方式的不同之处在于,此时动态字符串sds的内存与其依赖的redisObject的内存不再连续了

 

明明没有超过阈值,为什么变成raw?

对于 embstr,由于其实现是只读的,因此在对 embstr 对象进行修改时,都会先 转化为 raw 再进行修改。因此,只要是修改 embstr 对象,修改后的对象一定是 raw 的,无论是否达到了 44 个字节。

查看数据类型相关命令 

redis看看类型:type key

 Redis Type 命令用于返回 key 所储存的值的类型。

redis 127.0.0.1:6379> TYPE KEY_NAME

返回 key 的数据类型,数据类型有:

  • none (key不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)

看看编码:object encoding 

OBJECT ENCODING <key> 返回给定 key 锁储存的值所使用的内部表示(representation)。

可以查看一个数据库键的值对象的编码。下表列出了不同编码的对象所对应的OBJECT ENCODING命令输出

debug结构:debug object person 

Redis Debug Object 命令是一个调试命令,它不应被客户端所使用。

redis 127.0.0.1:6379> DEBUG OBJECT key

 返回值:当 key 存在时,返回有关信息。 当 key 不存在时,返回一个错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis之string类型的三大编码解读 的相关文章

随机推荐

  • 分享一个轻量级免费UML绘图工具JUDE

    一 介绍 JUDE Java and UML Developers Environment 一个小巧实用的UML建模软件 绝对可以符合UML建模的要求 可以画CLASS USECASE STATECHART ACTIVITY OBJECT
  • jmeter 参数传递 无效

    问题 上个接口的返回值用于下个接口的入参 上个接口的返回值获取失败 解决 返回值获取需要从第一级开始 而不是想要的字段位置开始 且 后有一个点
  • 性能测试 —— Jmeter 命令行详细

    我们在启动Jmeter时 会看见 Don t use GUI mode for load testing only for Test creation and Test debugging For load testing use CLI
  • Ant Design Pro安装及简单搭建

    目录 一 node js npm及yarn安装及配置 二 Ant Design Pro安装及简单构建 Ant Design Pro 是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端 设计解决方案 致力于在设计规范和基
  • Linux opencv打开摄像头和opencv旋转90和180度

    1 opencv打开摄像头 include
  • Unity与安卓arr简单调用

    前言 简单记录一下 方便后期第三方SDK做参考 一 在AndroidStudio创建空项目 二 创建空模块 复制classes jar至创建新模块的lib中 并加入设置Library classes jar文件来自你当前要使用的arr的Un
  • 深度学习MRI重建综述

    参考文章 A review and experimental evaluation of deep learningmethods for MRI reconstruction 文字有点乱 可以看表格 基于展开的方法 Yang et al
  • C#中对txt文件的读写操作

    C 中对txt文件进行读写操作包括两种方式 一种是基于FileInfo类 调用该类的Read方法 但是该方法读出来的数据是byte格式 需要对其进行解码 将相应的字节数转换为字符 而C 中System Text引用就包含的解码的方法 相应代
  • php消息队列的应用

    欢迎加入 新群号码 99640845 最近打算开发一个新功能 计划应用消息队列 以前对消息队列都是简单的理论了解 真正应用之后把自己的感觉和一些理解整理下来 说正事分割线 具体的业务场景如下 用户下单 生成订单 支付 返回支付信息 就是正常
  • el-tab切换时echarts图表宽度变为100px

    由于el tabs切换的时候 不显示的tab内容默认通过display none 所以导致echarts图表为100px 解决办法 在图表上使用v if来解决
  • c++ 九九乘法表,倒计时,成语接龙等游戏源代码

    include
  • 数据结构之顺序表详解

    目录 前言 1 顺序表 2 顺序表及其功能实现 2 1 准备工作 2 2 顺序表结构的创建 2 3 顺序表的初始化 2 4 顺序表向后插入数据 2 5 打印函数的实现 2 5 顺序表从后删除数据 2 6 顺序表向前插入数据 2 7 顺序表从
  • chrome45以后的版本安装lodop后,仍提示未安装解决

    请先查看你chrome浏览器的版本 如果是45版本以前的版本 安装后仍提示 未安装 或 请升级 请参照本链接解决 http blog sina com cn s blog 721e77e50102vfjl html 以下是chrome版本4
  • 一键部署设计稿至线上 —— D2C国产神器

    微软近期推出了Power Apps 新功能 Express Design 只要上传一个草图或者是 Figma 文件 Express Design 都会在几秒钟之内用 AI 技术将其转化为一个应用程序 不写代码就能生成一个应用 一直以来是我们
  • 服务器上调试程序 pdb命令调试

    以前写python一直用pycharm 调试啥的比较方便 最近要在远程服务器上调试一些程序 只有一个控制台就可以用pdb进行调试了 常用的只有几个命令 break 或 b 设置断点 continue 或 c 继续执行程序 list 或 l
  • 输入一个字符串,判断其是否是回文。(回文:即正读和反读都一样,如abccba, abccba)

    输入一个字符串 判断其是否是回文 回文 即正读和反读都一样 如abccba abccba 这里讨了个巧用了strcmp函数 注 strcmp用法 字符串比较函数 一般形式为strcmp 字符串1 字符串2 比较规则 对两个字符串自左至右逐个
  • linux 系统留后门方法和清除日志

    1 setuid cp bin sh tmp sh chmod u s tmp sh 加上 suid 位到shell上 虽然很简单 但容易被发现 2 echo hack 0 0 bin csh gt gt etc passwd 即给系统增加
  • 剑指 Offer 62. 圆圈中最后剩下的数字(java+python)

    0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆圈 从数字0开始每次删除第3个数字 则删除的前4个
  • Qt QToolButton和QListWidget的使用

    1 本篇简介 本篇主要演示QListWidget的使用 还涉及工具箱 QToolBox 和工具按钮 QToolButton 的使用 还会通过Action创建工具按钮的下拉菜单和QListWidget的组件的快捷菜单 展示如下图 2 QLis
  • Redis之string类型的三大编码解读

    目录 string类型的三大编码 int 编码 embstr 编码 raw 编码 明明没有超过阈值 为什么变成raw 查看数据类型相关命令 redis看看类型 type key 看看编码 object encoding debug结构 de