Redis_SDS(redis 动态字符串)

Simple Dynamic String

  1. http://redisbook.com/
  2. sds

请添加图片描述

sds

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

总结

  1. 缓冲区不会溢出(结构属性为length)
  2. 减少内存的重新分配和引入了惰性释放的机制(结构属性为free)
  3. 二进制数据安全
  4. 兼容了部分的c字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值