Redis源码学习(24),sds学习总结

本文详细介绍了Redis源码中SDS(Simple Dynamic String)的结构与相关方法,包括len、free和buf属性,以及sdslen、sdsavail等操作。SDS是一种优化的字符串数据结构,通过记录长度和空闲空间,实现快速获取字符串长度和避免频繁内存分配,提升性能。此外,还探讨了SDS的扩容策略和字符串拼接操作。
摘要由CSDN通过智能技术生成

1 学习回顾

Redis源码学习(21),sds学习,sds.h
Redis源码学习(22),sds学习,sds.c(一)
Redis源码学习(23),sds学习,sds.c(二)

2 学习概括

2.1 SDS

typedef char *sds;

struct sdshdr {
    unsigned int len;
    unsigned int free;
    char buf[];
};
  1. SDS 是动态字符串(Simple Dynamic String,SDS)的简称。
  2. SDS 包含len、free、buf三个属性,分别代表字符串长度、可分配空间、字符数组。
  3. 源代码中的sds是 char *的别名,也是代表字符数组的指针。

2.2 SDS相关方法

  1. sdslen 方法,返回sds 的字符串长度。
  2. sdsavail 方法,返回sds剩余空间。
  3. sdsnewlen 方法,创建一个新的sds字符串。
  4. sdsempty 方法,创建一个空的sds字符串。
  5. sdsnew 方法,调用sdsnewlen,创建一个新的字符串。
  6. sdsfree 方法,释放sds的内存。
  7. sdsclear 方法,清空sds字符串内容。
  8. sdsMakeRoomFor 方法,动态扩容, 为sds增加空闲空间。
  9. sdsIncrLen 方法,sds增加字符串长度。
  10. sdscatlen 方法, 在sds尾部拼接另一个字符串。
  11. sdscat 方法,调用sdscatlen ,拼接另一个字符串。
  12. sdscatsds方法,调用sdscatlen,拼接另一个字符串。

3 学习总结

  1. 动态字符串(Simple Dynamic String,SDS)是Redis专门设计的一种字符串数据结构。
  2. SDS结构包含len、free、buf三个属性,分别代表字符串长度、可分配空间、字符数组。
  3. SDS通过访问len属性可以快速得到字符串的长度,而不是需要遍历字符串每个字符到结尾。
  4. SDS通过记录free属性,可以查询当前sds还有多少分配空间,这样可以避免反复分配内存空间。
  5. sds.h头文件里定义sds的结构体定义,还有sdslen、sdsavail方法,还有一些方法签名。
  6. sds结构需要增加字符串长度的时候会先调用 sdsMakeRoomFor 方法进行动态扩容。
  7. 动态扩容有两种选择,一种方法是翻倍,一种加1M空间。
  8. 一般操作了字符串都会变动 sds 的 len和 free属性,两者一般是一加一减的关系。
  9. 每次变更sds都会在字符尾部设置结束符。

4 学习感悟

 原本我以为很简单字符串,没想到Redis都对字符串做了重新设计,叫做简单动态字符串SDS,在保持原有字符串的基础上又附加了长度和空闲空间两个属性。

 长度属性,不仅可以使获取字符串长度时间复杂度变为O(1),还可以配合和空闲空间属性做一些联动计算逻辑,一般增加了长度就要减少空闲空间,减少了长度,就要增加空闲空间。

 空闲空间属性,可以用来帮助SDS控制存储空间,节省更改字符串重新分配内存空间的次数,要知道Redis追求高性能,如果反复重新分配内存肯定会影响性能。

 说到空闲空间的话,就要说道SDS一个非常重要的扩容机制,每次更改字符串如果字符串长度超过空闲长度的话,就要对进行扩容动作,扩容动作有两种方式,一种是将新的字符串长度翻倍,一种是在新长度上再加1M的空间。

 在Redis里的字符串都是用SDS来存储,所以了解这个数据结构,可以方便阅读其他的代码,不至于在处于懵逼的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值