Redis字符串SDS(simple dynamic string)

本文深入解析了Redis中的简单动态字符串(SDS),对比C字符串,介绍了SDS的结构定义、内存分配策略及其优势,如O(1)的时间复杂度获取长度、避免buffer overflow和内存泄漏等问题。

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

Redis字符串SDS(simple dynamic string)

一 SDS结构定义

struct {
  int len;  //记录buf中已使用的字节数量
  int free;  //buf中未使用的字节数量
  char buf[]; //字节数组
}

二 SDS与C字符串的区别

  • C字符串获取字符串长度需要遍历字节数组,时间复杂度O(N)。SDS设置和更新长度在API执行时完成,获取长度时间复杂度O(1)
  • 由于C字符串扩容可能导致buffer overflow,缩减字符串会导致内存泄漏。SDS具有一套内存分配策略,可以杜绝这些问题

三 SDS内存分配策略

  • 对SDS修改后小于1M的情况,会计算出扩容后的len*2+1,1是为了保留空字符串。例如"hello",len=5,free=0,buf=6,拼接为"hello world"后,len=11,free=11,buf=27。这样做是为了减少分配次数以提高性能。
  • 修改后大于1M,会分配1M对free空间。例如扩容后len=2M,buf=3M+1byte。
  • 惰性空间释放,当使用SDS API进行字符串缩减,并不会立即释放free空间,避免再此扩容造成性能损耗。SDS提供了相应的API真正的释放空间
  • 兼容部分C字符串函数,<String.h>部分函数同样支持SDS字符串
  • 二进制安全,因为SDS通过len判断字符串是否结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值