Redis数据结构底层(二):SDS

SDS定义

简单动态字符串(Simple Dynamic String),又称SDS。是redis中用来表示字符串的一种数据结构,我们可以在sds.h头文件中找到有关它的结构体定义:

struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; //已保存的字符串字节数
    uint8_t alloc; //申请的总字节数
    unsigned char flags; //不同SDS的头类型,用来控制SDS的头大小
    char buf[];
};

其中的char[]为实际保存的数据,它可以存储任意二进制数据,并且实现了C字符串的所有函数操作,如字符串拼接、截取、查询等。

image-20240704122157881

SDS特点

SDS结构体具有以下特点和优势:

  1. 动态扩展:SDS采用动态扩展的策略来管理字符串的内存空间,避免了每次操作都需要重新分配内存的性能损耗。

  2. 内存预分配:SDS在分配内存空间时,会首先分配一定的额外空间,减少频繁扩容操作。

  3. 二进制安全:SDS可以存储任意二进制数据,并且不会因为字符串中包含\0字符而出现字符串截断的情况。

  4. 内部空间信息:SDS通过lenalloc字段记录了字符串的长度和未使用空间长度,方便快速获取字符串长度且动态扩展时的内存分配。

SDS编码

在Redis中,SDS可以使用不同的编码方式来存储字符串数据,根据数据类型和数据长度的不同,可以选择最适合的编码方式。以下是Redis中SDS的不同编码方式:

  1. RAW 编码

    • 当字符串小于1MB且可以完全存储在SDS结构体的 buf 字段中时,采用 RAW 编码。

    • RAW 编码存储的字符串数据以字节数组的形式直接存储在SDS结构体内部的 buf 字段中,不需要额外的内存分配。

  2. EMBSTR 编码

    • 当字符串长度小于等于44字节时,采用 EMBSTR 编码。

    • EMBSTR 编码在SDS结构体的 buf 字段中存储字符串数据,并且在 buf 后面留出一定的空间,用于进行字符串操作后的扩容。

  3. INT 编码

    • 当字符串可以转换为整数且符合整数值的范围时(特别是长整数),字符串可以采用 INT 编码。

    • INT 编码将整数转换并存储在 buf 字段中,避免了字符串数据的存储和处理开销。

EMBSTR编码与RAW编码的区别

EMBSTR编码

image-20240704123403400

RAW编码

image-20240704123515812

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值