Redis2-简单动态字符串

Redis2-简单动态字符串
Redis2-简单动态字符串
Redis2-简单动态字符串
除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的。

一、SDS的定义

每个sds.h/sdshdr结构表示一个SDS值:
Redis2-简单动态字符串
Redis2-简单动态字符串
上图表示了一个SDS实例:

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

Redis2-简单动态字符串

下图展示了另一个SDS实例。这个SDS和上面的一样,都保存了字符串值“Redis”,这个SDS和之前展示的SDS的区别在于,这个SDS为buf数组分配了五字节未使用空间,所以它的free属性的值为5.
Redis2-简单动态字符串

二、SDS与C字符串的区别

Redis2-简单动态字符串

2.1 常数复杂度获取字符串长度

Redis2-简单动态字符串
Redis2-简单动态字符串
Redis2-简单动态字符串
Redis2-简单动态字符串
通过使用SDS而不是C字符串,Redis将获取字符串长度所需的复杂度从O(N)降低到了O(1),这确保了获取字符串长度的工作不会成为Redis的性能瓶颈。例如,因为字符串键在底层使用SDS来实现,所以即使我们对一个非常长的字符串键反复执行STRLEN命令,也不会对系统性能造成任何影响,因为该命令的时间复杂度仅为O(1)。

2.2 杜绝缓冲区溢出

2.3 减少修改字符串时带来的内存重分配次数

2.4 二进制安全

2.5 兼容部分C字符串函数