redis-动态字符串
Contents
redis简单动态字符串,即sds。
sds定义
3.2版本如下面五种类型,以前是只有一种。
源码位置sds.h/sdshdr
,
1 | typedef char *sds; // char buf[] 的指针 |
sds和c字符串的区别
redis只使用c字符串为字面值
共同点:
- 都已
\0
结尾,表示到达了字符串尾部
sds不同于C字符串:
- sds常数复杂度获取字符串长度
- 杜绝缓冲区溢出
- 减少修改字符串时带来的重新分配内存
- 空间预分配
- 惰性空间释放
- 二进制安全,即buf可存在多个
\0
- 兼容C的部分字符串
重点
空间预分配
已1MB为界限每次扩容时:
- 修改后已使用(len)小于1MB,则分配同样大小的未使用空间
- 修改后已使用(len)大于1MB,则分配1MB未使用空间
惰性空间释放
字符串截断或者内容变少时,不会释放空间,只是改变空间大小(len和free)。
多余空间如下步骤释放(robj释放空间原理):
- 只针对raw和embstr类型做编码处理,把空闲内存回收
- 对这俩种类型尝试转long类型
- raw类型长度小于44,用embstr表示返回
- 重新分配空间,并且所有应用指向新的空间
更多源码注释说明见sds.h
(https://github.com/dalaizhao/redis/tree/feature_code_comment)[https://github.com/dalaizhao/redis/tree/feature_code_comment]