Redis:SDS定义

Posted wwzyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis:SDS定义相关的知识,希望对你有一定的参考价值。

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

使用场景:SET key  "hello"  或RPUSH list  "a" "b" "c"

数据结构:
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真正的释放内存空间,避免造成内存浪费。

 

以上是关于Redis:SDS定义的主要内容,如果未能解决你的问题,请参考以下文章

Redis源码解析01: 简单动态字符串SDS

Redis自定义动态字符串(sds)模块

关于redis中SDS简单动态字符串

redis源码阅读——动态字符串sds

了解下Redis的SDS结构

Redis设计与实现读书笔记 SDS