Redis SDS预分配空间机制

Redis的SDS通过预分配空间来减少内存分配的次数,具体策略如下:

  1. 预分配规则
  • 当字符串长度小于1MB时,扩容会分配双倍空间
    • 例如:修改后长度为13字节,则会分配13+13=26字节
  • 当字符串长度大于等于1MB时,扩容会多分配1MB空间
    • 例如:修改后长度为30MB,则会分配30MB+1MB=31MB
  1. 优势说明
  • 减少内存重新分配次数
    • 传统C字符串每次增长都需要重新分配内存
    • SDS预分配策略让连续增长可以重用之前预留的空间
  • 降低内存操作开销
    • 减少了malloc、realloc、free等系统调用
    • 避免了频繁的数据复制和移动
  1. 举例说明
    假设字符串从空开始,依次追加5次,每次1个字节:
  • 传统C字符串:需要5次内存分配
  • Redis SDS:
    • 第1次:分配1+1=2字节
    • 第2次:使用预分配空间,无需分配
    • 第3次:使用预分配空间,无需分配
    • 第4次:分配4+4=8字节
    • 第5次:使用预分配空间,无需分配
      最终只需要2次内存分配