2.1 Redis中SDS的定义

SDS是Redis中用于字符串操作的数据结构,它包含len、free和buf三个属性。len表示已使用字节数量,free表示未使用字节数量,buf则保存字符串。当free为0时,表示没有额外空间;非0时,表示有空闲空间可供使用。SDS遵循C字符串以空字符结尾的惯例,但len属性不包括空字符。这使得SDS可以兼容部分C字符串函数,如直接使用printf打印SDS内容。SDS的优势在于动态调整空间和避免缓冲区溢出,且提供了更安全和高效的字符串操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个sds.h/sdshdr 结构表示一个SDS值

struct sdshdr {
//记录 buf 数组中已经使用的字节数量
//等于SDS所保存字符串的长度
int len;

//记录buf数组中未使用字节的数量
int free;

//字节数组,用于保存字符串
char buf[];
};

在这里插入图片描述

图2-1 展示了一个SDS 示例:

1、free 属性值为0,表示这个SDS没有继续分配可使用的空间了。
2、len属性的值为5,表示这个SDS已经保存了一个5字节的字符串。
3、buf属性 是一个char类型的数组,数组的前5个字节分别保存了
‘R’、‘e’、‘d’、‘i’、‘s’五个字符,而最后一个字节则保存了空字符’\0’。

SDS遵循C字符串以空字符结尾的惯例,保存在空字符的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的1字节空间,以及添加空字符到字符串末尾的操作都是由SDS函数自动完成的,所以这个空字符对于SDS的使用者来说是完全透明的。遵循空字符结尾这一惯例的好处是,SDS可以直接重用一部分C字符串函数库里的函数。

举个例子,如果我们有一个指向图2-1所示SDS的指针s,那么可以直接使用<stdio.h>/printf函数,通过执行以下语句:

printf("%s",s->buf); 

来打印出SDS保存的字符串值"Redsi",而无需为SDS编写专门的打印函数。

**下面图2-2 展示了另一个示例。**这个SDS和之前展示的SDS一样,都保存了字符串值"Redis"。这个SDS和之前的区别在于,这个SDS为buf数组分配了5个未使用的字节空间,所以他的free 属性的值为5(图中,使用5个空格来表示5个未使用的字节空间)。
在这里插入图片描述

链接: 在2.2章节 会说明SDS 与C字符串的区别,以及为Redis为啥要使用SDS这种数据结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值