了解下Redis的SDS结构
Posted 梁老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解下Redis的SDS结构相关的知识,希望对你有一定的参考价值。
SDS (简单动态字符串)
sds是Redis里面的一种结构,通过它对字符串的操作进行了很多的优化操作。
SDS的结构定义
struct stdhdr {
int len //记录buff数组中已使用字节的数量
int free //记录buff数组中未使用字节的数量
char buff[] //字节数组,用于保存字符串
}
SDS的示例,见下图
free值为0, 表示这个SDS没有分配任何未使用空间。
len值为4, 表示这个SDS保存一个四字节长的字符串。
buff值为一个char类型数组,分别保存’L‘,’i‘,‘a‘,‘n‘ 4个字符,最后一个字节保存;’ ‘
SDS与C字符串的区别
C语言使用长度N+1的字符数组来表示长度为N的字符串,并且最后一个字符串总是空字符串’ ‘.
,而且它并不记录自身的长度信息,如果要获取,必须全部遍历;但SDS不一样,他有len属性记录了长度,所以获取长度的复杂度很高。C字符串容易缓冲区溢出,而SDS的空间分配策略则不会,当需要操作字符串时,会先检测空间大小,如果不满足,则需要对空间做扩展。
C在对字符串做修改时,因为没有记录长度信息,所以需要频繁对内存做分配,而SDS通过free属性来记录未使用的空间,实现空间预分配和惰性空间释放。
#### 1 空间预分配
空间预分配用于优化SDS的字符串增长操作,当对SDS字符做修改时,不仅会分配所需要的空间,还会为SDS分配额外的未使用空间。
分配未使用空间策略如下
- 如果对SDS操作后,SDS的长度(len的值)小于1M,那么程序分配和len同样大小的未使用空间。
- 如果对SDS操作后,SDS的长度(len的值)大于等于1M,那么程序会分配1M的未使用空间。
#### 惰性空间释放
惰性空间释放用于优于SDS的字符串缩短操作,当缩短SDS字符串时,程序不立即使用内存重分配回收多出来的字节,而是用free属性记录,下交要用时,查看 free的大小,避免重复分配了。
C字符串不能包含空字符,所以它只能保存文本数据,不能保存图片、音频、视频等二进制数据,而SDS都会处理二进制的方式来处理buff数组里面的数据,也不会对数据做任何限制、过滤等,存取数据一致。
虽然SDS是二进制安全的,但字符串结尾和C一样,也是以空字符串作结尾。这样就能兼容一部分C字符串函数了。
以上是关于了解下Redis的SDS结构的主要内容,如果未能解决你的问题,请参考以下文章