String详解

[toc]

String是Redis中最常用的数据类型之一,它的编码方式如下:

  • 基本编码方式为RAW,基于SDS实现,存储上限为512M

image-20240921144907223

  • 如果SDS的长度小于等于44字节,则会采用EMBSTR编码,此时Object head和SDS改为使用连续空间,申请内存时也就只需要一次内存分配,提升效率。

    image-20240921145029881

为什么是44字节?

答:SDS为x字节(x<=44)时,连续空间总长度为 16 (RedisObject) + 1(len) + 1(alloc) + 1(flags) + x + 1('\0') = x + 20 <= 64,而Redis底层内存是以$2^n$进行内存分配的,64B恰好是一个分片大小,因此不会产生内存碎片。

  • 如果存储的字符串是整数值,并且大小在LONG_MAX内,则会采用INT编码,直接将数据保存在RedisObject的ptr位置
    • 因为ptr刚好是8字节,此时不再需要sds部分

image-20240921145811029