动态字符串SDS
我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。
不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:
V获取字符串长度的需要通过运算
V非二进制安全
V不可修改
Redis构建了一种新的字符串结构,称为简单动态字符串( Simple Dynamic String) ,简称SDS。
例如,我们执行命令:
那么Redis将在底层创建两个SDS,其中一个是包含"name" 的SDS,另一个是包含“虎哥“的SDS。
Redis是C语言实现的,其中SDS是一个结构体(类似JAVA中的类),源码如下:
例如,一个包含字符串"name" 的sds结构如下:
SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为"hi" 的SDS:
假如我们要给SDS追加一段字符串",Amy",这里首先会申请新内存空间:
◆如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1;
◆如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1,称为内存预分配。
优点
①获取字符 串长度的时间复杂度为0(1)
②支持动态扩容
③减少内存分配次数
④二进制安全
标签:动态,SDS,Redis,C语言,字符串,数据结构,1M From: https://blog.51cto.com/AmbitionGarden/8380114