本文共 545 字,大约阅读时间需要 1 分钟。
字符串对象
- 简单动态字符串SDS
- 用途
- 定义
- 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设计与实现》
转载地址:http://ihiii.baihongyu.com/