博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis研究-2.简单动态字符串操作
阅读量:6156 次
发布时间:2019-06-21

本文共 2835 字,大约阅读时间需要 9 分钟。

hot3.png

上一篇,讲了基本的Redis为什么要使用自己的SDS,以及使用SDS带来的好处,这一篇主要说说针对这个SDS,Redis封装了哪些操作,在看封装的函数之前,先看一下sds.h里面的一个申明:typedef char *sds;这个申明,在Redis的SDS中启到了非常重要的作用,这个字符指针是用于指向 sdshdr 的 buf 属性。因此,如果你要根据这个sds指针来求出SDS的首地址,你应该使用(s-(sizeof(struct sdshdr )))的方式就能得到。

在sds.h中定义了两个局限于本文件使用的两个函数,分别是获得sdshdr的len属性值,以及获得sdshdr的free值,分别是:

获得sdshdr的len属性
static inline size_t sdslen(const sds s) {    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));    return sh->len;}
获得sdshdr的free属性
static inline size_t sdsavail(const sds s) {    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));    return sh->free;}

同样,在这个头文件中,申明了很多函数,分别是:

sds sdsnewlen(const void *init, size_t initlen);//用指定的char *字符指针和指定的长度来创建一个Redis sdssds sdsnew(const char *init);//用指定的char *init 来创建一个Redis sdssds sdsempty(void);//创建一个空的Redis sdssize_t sdslen(const sds s);sds sdsdup(const sds s);//使用指定的sds来创建一个副本,是使用sdsnewlen来创建的副本void sdsfree(sds s);//释放给定的sds,用到zfree,这个函数申明在zmalloc.h中,在zmalloc.c中实现size_t sdsavail(const sds s);sds sdsgrowzero(sds s, size_t len);//将 sds 扩充至指定长度,未使用的空间以 0 字节填充sds sdscatlen(sds s, const void *t, size_t len);//将长度为len的字符串t,添加到sds的末尾sds sdscat(sds s, const char *t); //将给定字符串t添加到sds的末尾
sds sdscatsds(sds s, const sds t);//将一个sds追加到另一个sds末尾sds sdscpylen(sds s, const char *t, size_t len);//将字符串t的前len个字符追加到sds末尾sds sdscpy(sds s, const char *t);//将字符串t复制到sds中sds sdscatvprintf(sds s, const char *fmt, va_list ap);//打印函数#ifdef __GNUC__sds sdscatprintf(sds s, const char *fmt, ...)    __attribute__((format(printf, 2, 3)));//#elsesds sdscatprintf(sds s, const char *fmt, ...);//打印人一个字符串,并将字符串添加到sds的末尾#endifsds 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,按照闭区间的索引来截取void sdsupdatelen(sds s);//重分配len和freevoid sdsclear(sds s);//在不释放sds的空间的情况下,将sds保存的内容重置为空字符int sdscmp(const sds s1, const sds s2);//比较两个sdssds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);//用分隔符sep来分割svoid sdsfreesplitres(sds *tokens, int count);//释放sds数组中的count个sdsvoid sdstolower(sds s);//将sds中的内容转化为小写void sdstoupper(sds s);//将sds中的内容转化为大写sds sdsfromlonglong(long long value);//根据输入的long long value值来创建一个sdssds sdscatrepr(sds s, const char *p, size_t len);//将长度为len的字符串p,用引号的方式添加到sds末尾sds *sdssplitargs(const char *line, int *argc);//将一行文本分割为多个参数sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);//将s中在from出现的字符替换为to中的字符sds sdsjoin(char **argv, int argc, char *sep);//将一个c字符串的数组用指定的分隔符sep添加到sds中/* Low level functions exposed to the user API */sds sdsMakeRoomFor(sds s, size_t addlen);//对sds中的buf进行长度扩展void sdsIncrLen(sds s, int incr);//根据incr来扩展sds的长度,所见空余空间sds sdsRemoveFreeSpace(sds s);//回收sds中的空余空间size_t sdsAllocSize(sds s);//返回给定的sds的已经分配的空间的字节数

转载于:https://my.oschina.net/u/197860/blog/496281

你可能感兴趣的文章
人工智能与大数据的耦合,将会怎么影响我们的生活
查看>>
数据运营的三种角色
查看>>
【译】CSS 自定义属性的策略指南
查看>>
从零实现一个自定义 HTML5 播放器
查看>>
WeGeek Talk | 美团外卖
查看>>
使用 Karma、Mocha、Chai 搭建支持 ES6 的测试环境
查看>>
linux/unix编程手册-16_20
查看>>
[译] Android 的多摄像头支持
查看>>
【个人思考系列】美团点评 Java 后端新人第一年总结&面试经验 | 掘金技术征文...
查看>>
从零开始netty学习笔记之BIO
查看>>
快来围观一下JavaScript的Proxy
查看>>
基于可靠消息方案的分布式事务:Lottor介绍
查看>>
分布式存储的六大优点
查看>>
闭包总结(2018.03.19)
查看>>
Exploiting “BadIRET” vulnerability (CVE-2014-9322, Linux kernel privilege escalation)
查看>>
磁盘分区原理:从MBR到GPT
查看>>
再谈 Go 语言在前端的应用前景
查看>>
机器学习能诊断病情,还能预测患者出院后的情况?
查看>>
使用云效在阿里云上进行一站式开发运维
查看>>
《JavaScript设计模式与开发实践》原则篇(3)—— 开放-封闭原则
查看>>