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


    目录

    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 锁储存的值所使用的内部表示(representation)。

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

    debug结构:debug object person 

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

    redis 127.0.0.1:6379> DEBUG OBJECT key

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

  • 相关阅读:
    Ubuntu Server CLI专业提示
    java版Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    两化融合办理有补贴吗,办理条件是什么?
    死锁产生的条件及其预防
    NXP i.MX8系列平台开发讲解 - 1.1 导读前言
    微服务框架 案例
    智慧公厕蜕变多功能城市智慧驿站公厕的创新
    C++核心编程——P36-友元
    设计模式-07-装饰器模式
    ROS机械臂启动碰撞检测和启动捡拾算法时出现的两个错误,有大佬能帮忙解决吗
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/132708477