在眼下版本号的 Redis 中, SDS_MAX_PREALLOC 的值为 1024 * 1024 , 也就是说。 当大小小于 1MB 的字符串运行追加操作时,sdsMakeRoomFor 就为它们分配多于所需大小一倍的空间; 当字符串的大小大于 1MB 。 那么 sdsMakeRoomFor 就为它们额外多分配 1MB 的空间。

运行过 APPEND 命令的字符串会带有额外的预分配空间。 这些预分配空间不会被释放。 除非该字符串所相应的键被删除, 或者等到关闭 Redis 之后, 再次启动时又一次加载的字符串对象将不会有预分配空间。

由于运行 APPEND 命令的字符串键数量通常并不多, 占用内存的体积通常也不大。 所以这一般并不算什么问题。

还有一方面。 假设运行 APPEND 操作的键非常多。 而字符串的体积又非常大的话, 那可能就须要改动 Redis server。 让它定时释放一些字符串键的预分配空间。 从而更有效地使用内存。

小结

  • Redis 的字符串表示为 sds 。而不是 C 字符串(以 \0 结尾的 char*)。
  • 对照 C 字符串, sds 有下面特性:
    • 能够高效地运行长度计算(strlen);
    • 能够高效地运行追加操作(append);
    • 二进制安全;
  • sds 会为追加操作进行优化:加快追加操作的速度。并减少内存分配的次数,代价是多占用了一些内存。并且这些内存不会被主动释放。