redis之二字符串

来源:互联网 发布:sqlserver时间比较 编辑:程序博客网 时间:2024/06/07 19:41

1 Redis的SDS

Redis没有直接使用C语言传统字符串的表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS作为Redis的默认字符串表示。

2 Redis的SDS使用例子

命令:SET msg “hello world”

Redis的处理方式,创建一个新的键值对,其中:

1)       键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串”msg”的SDS。

2)       键值对的值也是一个字符串对象,对象的底层实现是一个报错这字符串”helloworld”的SDS。

备注:一个键值对中的值也可能是一个数组或者列表对象,其中每个数组元素或者列表元素都是以SDS形式存在的。

3 Redis的SDS的其他用途

1)       AOF模块的AOF缓冲区

2)       客户端状态中的输入缓冲区

4 Redis的SDS的结构

struct sdshdr{int len;int free;char buf[];}

1)    free标识这个SDS分配的未使用空间。

2)    len标识这个保存了一个len长度的字符串

3)    buf 是一个char类型数组,保存着这个字符串的内容。

5 Redis的SDS的优点

1)       常数复杂多获取字符串的长度,因为有len的存在

2)       杜绝缓冲区溢出,当SDS的API打算对SDS进行修改的时候,API会检查SDS的空间是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间扩展至执行修改所需的大小,然后执行实际的修改操作。

3)       减少修改字符串时带来的内存重分配次数。SDS通过未使用的空间free字段的值解除了字符串长度和底层数组长度之间的关联。通过未使用空间,SDS实现了空间预分配和惰性空间释放(当SDS需要缩短SDS保存的字符串时,程序并不会立即使用内存重分配来缩短多出来的字节,而是使用free属性将这些字节记录起来,等待将来使用)两种策略。

4)       二进制安全。SDS使用len属性的值而不是空字符串来判断字符串是否结束,所以Redis可以保存任意格式的二进制数据。

 

0 0
原创粉丝点击