Redis数据结构:SDS

1. 简单动态字符串(simple dynamic string,SDS)是Redis的默认字符串表示结构,底层的string都是基于SDS实现。Redis基于C语言,并引用了部分C函数。

使用场景:SET key  "hello"  或RPUSH list  "a" "b" "c" ,其中引号中的字符串就是SDS类型的

数据结构:
struct
sdshdr { //buf中保存的字符串长度 int len; //buf中空闲空间长度 int free; //字符串数组,注意:buf会在结尾处额外分配一个字符'\0',不参与计算 char buf[]; };

2. 动态扩容策略:

在拼接一个字符串时,Redis会先检查是否有多余的空间,若不够会先扩容到符合【已有长度+新长度】,然后再拼接,并额外再分配相同大小的空间。

2.1 预分配:

1)如果对SDS进行修改之后,len如果小于1MB,那么程序也会分配和len相同大小的为使用空间,这时len=free。比如:SDS的len=5,free=0,当添加一个长度为3的字符串后,len=8,free=8,此时buf的长度为8+8+1(额外的一字节为'\0');当下次再添加3个字符串时,free的长度符合要求,就不会触发扩容了。

2)如果len大于等于1MB,那么程序会额外分配1MB的空间。

2.2 懒释放

当减少一些字符串时,程序移除掉那些字符串后,空闲的空间不会立即回收,而是修改free记录一下大小,等下次再添加时,就可以直接使用空闲的空间了。SDS也提供了相应的API真正的释放内存空间,避免造成内存浪费。

 

posted on 2019-03-26 11:44  wzyy  阅读(304)  评论(0编辑  收藏  举报