Redis开源代码读书笔记六(sds模块)

SDS是一个动态字符串库,主要用于字符串操作。

SDS模块功能特性

==》支持字符串基本操作(new, free, dup, cpy, append, add, trim, cmp, range, split, join, lower, upper, map, repr)
==》支持字符串实际长度和剩余长度统计
==》支持二进制(字符串)安全操作(new, free, dup, cpy, cmp, append, range)
==》支持字符串动态扩展(性能优化)

注:这里的二进制安全操作指的是可以不是字符串,比如一个对象。

SDS模块结构体


struct sdshdr {
    unsigned int len;
    unsigned int free;
    char buf[];
};



SDS模块内部接口

sds sdsMakeRoomFor(sds s, size_t addlen);
扩充sds s字符串尾部空余字节。扩充规则是原sds s字符串两倍或者sds s长度加上SDS_MAX_PREALLOC

void sdsIncrLen(sds s, int incr);
修正sds s字符串增加incr长度后字符串末尾NULL和sds相关数据结构的操作

sds sdsRemoveFreeSpace(sds s);
缩减sds扩充的尾部空余字节,100%成功

size_t sdsAllocSize(sds s);
获取sds字符串总共占用的空间字节数

SDS代码阅读中需要理解的部分内部函数

sds sdscatvprintf(sds s, const char *fmt, va_list ap);
将格式化字符串追加到sds字符串末尾

int sdsll2str(char *s, long long value)
long long类型转化为字符串的函数,这里写死了LLSTR长度为21个字符,主要是longlong的范围最大是20位,加上一个NULL,正好是21位。

long long的最大值: 9223372036854775807  -- 19位
long long的最小值:-9223372036854775808  -- 20位

#define SDS_LLSTR_SIZE 21 /* 含NULL结尾字符串 */

SDS模块基本接口


static inline size_t sdslen(const sds s)
获取sds字符串长度

static inline size_t sdsavail(const sds s)
获取sds字符串剩余空间

sds sdsnewlen(const void *init, size_t initlen);
用init指针新建一个sds安全字符串

sds sdsnew(const char *init);
新建一个ASCII字符串初始化的sds字符串

sds sdsempty(void);
新建一个空sds字符串

sds sdsdup(const sds s);
复制一个sds字符串

void sdsfree(sds s);
释放一个sds字符串

sds sdsgrowzero(sds s, size_t len);
扩充sds字符串至len长度,剩余空间初始化为0

sds sdscatlen(sds s, const void *t, size_t len);
追加sds字符串至len长度,剩余空间追加为t所指向的len长度内容

sds sdscat(sds s, const char *t);
追加一个NULL结尾字符串到sds字符串末尾

sds sdscatsds(sds s, const sds t);
追加sds t字符串到sds s字符串末尾

sds sdscpylen(sds s, const char *t, size_t len);
将字符串t复制到sds字符串

sds sdscpy(sds s, const char *t);
将NULL结尾字符串t复制到sds字符串

sds sdscatprintf(sds s, const char *fmt, ...);
将格式化字符串追加到sds字符串末尾

sds sdscatfmt(sds s, char const *fmt, ...);
sdscatprintf性能优化版本

sds sdstrim(sds s, const char *cset);
将sds字符串左右两边属于cset字符串的字符裁剪掉

void sdsrange(sds s, int start, int end);
将sds字符串内容更新为[start, end]范围的sds字符串内容

void sdsupdatelen(sds s);
更新sds字符串内部状态数据(字符长度,剩余空间)

void sdsclear(sds s);
清空sds字符串内部数据(状态数据清理,内容尚未真正清零)

int sdscmp(const sds s1, const sds s2);
sds字符串比较函数,类似memcmp

sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
字符串分割函数,返回count大小的sds字符串数组

sds *sdssplitargs(const char *line, int *argc);
参数分割函数,返回arc大小的sds字符串数组

void sdsfreesplitres(sds *tokens, int count);
释放sdssplitlen,sdssplitargs分割出来的sds字符串数组

void sdstolower(sds s);
sds字符串变更全小写

void sdstoupper(sds s);
sds字符串变更全大写

sds sdsfromlonglong(long long value);
将value转换为sds字符串

sds sdscatrepr(sds s, const char *p, size_t len);
将p指向的字符串转换为人可阅读的追加到sds后面

sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
sds字符串内按照[from, to]的字符map映射进行转换

sds sdsjoin(char **argv, int argc, char *sep);
将字符串用分隔符连接(sep),返回sds字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值