Redis中的string类型是最基础的数据结构,用于存储字符串、整数或浮点数。它的实现和存储原理如下:

数据结构

Redis的string类型基于简单动态字符串(SDS, Simple Dynamic String),其结构如下:

struct sdshdr {
    int len;        // 记录字符串长度
    int free;       // 记录未使用的字节数
    char buf[];     // 存储字符串内容的字节数组
};
  • len:记录字符串的实际长度。

  • free:记录未使用的字节数,用于预分配空间以减少内存分配次数。

  • buf:存储字符串内容的字节数组,以\0结尾,兼容C字符串函数。

存储原理

预分配空间

  • 当字符串长度增加时,Redis会预分配额外的空间(通常为当前长度的两倍),以减少频繁内存分配的开销;

  • 例如,字符串从5字节扩展到10字节时,Redis可能分配20字节的空间,其中10字节用于存储数据,10字节为未使用的空间。

惰性空间释放

  • 当字符串长度缩短时,Redis不会立即释放多余空间,而是保留这些空间供未来使用,避免频繁的内存分配和释放操作。

编码优化

  • 对于小整数或短字符串,Redis使用int编码直接存储,减少内存占用;

  • 对于较长的字符串,Redis使用rawembstr编码:
    raw编码:适用于较长的字符串,分配独立的内存空间。
    embstr编码:适用于较短的字符串,将字符串和元数据存储在一块连续内存中,减少内存碎片。

Redis的string类型通过SDS实现,支持动态扩展和预分配,优化了内存使用和性能。通过不同的编码方式,Redis能够高效处理各种长度的字符串和数值类型。