redis SDS

来源:互联网 发布:编辑网页的软件 编辑:程序博客网 时间:2024/06/09 16:51

SDS

Redis在实现上使用了,自定义的SDS(simple dynamic string),来代替C语言传统的字符串表示方式。

  • free 属性的值为 0 , 表示这个 SDS 没有分配任何未使用空间。
  • len 属性的值为 5 , 表示这个 SDS 保存了一个五字节长的字符串。
  • buf 属性是一个 char 类型的数组, 数组的前五个字节分别保存了 'R' 、 'e' 、 'd' 、 'i' 、 's' 五个字符, 而最后一个字节则保存了空字符 '\0' 。


SDS对比C语言传统的字符串有以下优点:

  • 在常数时间复杂度获取字符串长度
    因为在SDS结构中已经保存了字符串的长度信息,并且在修改字符串时,也会对其进行相应的修改,所以获取字符串长度,无需遍历整个字符串。
  • 杜绝缓存区溢出
    在C字符串中如果你要对一个字符串进行扩展的话,就必须预先计算空间,如果空间不足久,就需要再申请一些内存空间。但要是忘记了预先分配空间的话,就会参数缓存区溢出。而使用SDS的API会自动的帮你计算并分配空间,从而杜绝了缓存区溢出的可能。



  • 减少内存分配次数
    相比于C字符串不记录长度信息,导致每次修改都需要进行内存重新分配(分配内存是一个相对耗时的系统调用) SDS就要灵活的多了,SDS的API通过 空间预先分配惰性空间释放 这两个方式去减少空间的重新分配,其中空间预先分配 是指当第一次对SDS字符串进行修改时,SDS不止分配足够的空间,而且会根据分配策略,多分配一些空间以备下次使用。惰性空间释放就是在缩短SDS字符串时仅仅删除字符内容,并不回收剩余的内存空间。
  • 二进制安全
    SDS 的 API 都是二进制安全的(binary-safe): 所有 SDS API 都会以处理二进制的方式来处理 SDS 存放在 buf 数组里的数据, 程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的, 它被读取时就是什么样。buf数组是字节数组,里面存储一系列的二进制数据。


0 0
原创粉丝点击