Simple Dynamic String
- http://redisbook.com/
- sds
sds
- sds的全部属性结构:1-addr 2-free 3-length 4-buff
- length+buff : 1-解决查询字符串的空间复杂度 2-解决了缓冲区溢出的问题
- 和普通c字符串的区别的是:c字符串以’/0’作为结束符,但是sds本身开辟了空间记录了长度,lenth加上buff存储完整的c字符串信息存储完整的字符串信息
- strlen的复杂度:从原来的o(n)在sds的设计中降低为o(1)
- 缓冲区溢出:strcat的时候,如果分配的空间不足,会错误拼接和修改到字符串
- redis sds:封装的api可以避免buff overflow 的出现,字符串拼接的空间分配刚好是是s1和s2的长度;
- free : 1-
- redis 的空间分配策略:(减少修改字符串带来的空间重新分配的次数)
- 空间预分配:
- 对字符串进行n次操作的时候,会根据当前的操作结果,预先分配空闲的空间存储在sds的buff中,例如:
- 操作一次字符串:s1的长度为11字节,s2的长度为3字节,需要的空间为:11+3+1字节,最后的一字节分配给’/0’结束符;
- 操作第二次字符串:将第一次预分配的空间预判断,足够保存第二次操作的结果,则不需要进行空间分配操作;
- 预分配空间:将第n次操作的结果进行空间判断,可以把原来字符串的必定n次操作分配空间 修改为:最多n次操作分配空间;
- 对字符串进行n次操作的时候,会根据当前的操作结果,预先分配空闲的空间存储在sds的buff中,例如:
- 惰性空间释放:
- free属性的标记:将当前操作中不需要使用到的空间先记录起来,而不进行实际的空间分配和释放,等待下一次需要的时候再进行使用;
- 操作函数:(s1移除s2的操作)sdstrim(s1,s2) ,移除后剩余的空间,不会进行实际的释放和重新分配,而是记录在free的属性中进行维护,等待下一次拓展字符串的操作
- 空间预分配:
- redis 的空间分配策略:(减少修改字符串带来的空间重新分配的次数)
- 二进制安全:写入的数据是怎样的,哪怕包含了’/0’的结束符号,也不会被系统识别为结束符号,而是完整的写入的数据格式
- 总结和操作API:
总结
- 缓冲区不会溢出(结构属性为length)
- 减少内存的重新分配和引入了惰性释放的机制(结构属性为free)
- 二进制数据安全
- 兼容了部分的c字符串