版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_32197439/article/details/84197970
字符串对象
- 简单动态字符串SDS
- 用途
- 键值对象
- 缓冲区
- AOF缓冲区
- 客户端的输入缓冲区
- 定义
- len 已使用的长度
- free 未使用的字节数量
- buf[] char数组 保存字符
- 注意
- O(1)时间复杂度获取字符串长度
- 防止缓冲区溢出,会自动扩展空间。
- 内存溢出
- 内存泄漏
- 为了解决以上问题 采用未使用空间的两种优化策略
- 空间预分配
- SDS修改后的长度小于1MB,将分配与len相同大小的值给未使用空间free.
- 如果修改之后的值大于等于1MB,将会分配1MB给未使用空间,例如修改后SDS的len变为30MB,buf数组的实际长度为30MB+1MB+1byte(保存空字符串)
- 扩展SDS的空间前将会 检查未使用空间是否足够,若足够无须进行内存分配。
- 惰性空间释放
- 用于优化字符串缩短操作。
- 当api操作缩短SDS的字符串时,并不立即使用内存分配来回收多余的字节,将其记录在free以便后面使用。
- 空间预分配
- 二进制安全
- 都是以二进制的方式来处理数据不会对其进行过滤和任何限制
- 用途
- 小结
- Redis使用SDS作为字符串的表示
- SDS以 0(1) 的时间复杂度获取字符串长度
- 能够杜绝缓冲区溢出
- 减少因字符串修改带来的内存重新分配的次数
- 二进制安全
- 兼容部分C字符串API
- 参考《Redis设计与实现》