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