Redis源代码分析之五:简单动态字符串——Sds

来源:互联网 发布:靠谱的理财产品 知乎 编辑:程序博客网 时间:2024/05/17 15:36

一个Redis字符串的结构体定义是:

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

其中buf字符数组中储存实际的字符串。len变量保存字符串的长度。free变量指出还有多少字节可用。

sds被定义为一种新的数据类型,实际就是字符指针:

typedef char *sds;

例如,sdsnewlen创建一个指定长度的新的Redis字符串:

sds sdsnewlen(const void *init, size_t initlen) {    struct sdshdr *sh;    sh = zmalloc(sizeof(struct sdshdr)+initlen+1);#ifdef SDS_ABORT_ON_OOM    if (sh == NULL) sdsOomAbort();#else    if (sh == NULL) return NULL;#endif    sh->len = initlen;    sh->free = 0;    if (initlen) {        if (init) memcpy(sh->buf, init, initlen);        else memset(sh->buf,0,initlen);    }    sh->buf[initlen] = '\0';    return (char*)sh->buf;}

全部的sds接口定义如下:

static inline size_t sdslen(const sds s) {    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));    return sh->len;}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);sds sdsnew(const char *init);sds sdsempty();size_t sdslen(const sds s);sds sdsdup(const sds s);void sdsfree(sds s);size_t sdsavail(sds s);sds sdsgrowzero(sds s, size_t len);sds sdscatlen(sds s, void *t, size_t len);sds sdscat(sds s, char *t);sds sdscatsds(sds s, sds t);sds sdscpylen(sds s, char *t, size_t len);sds sdscpy(sds s, char *t);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, ...);#endifsds sdstrim(sds s, const char *cset);sds sdsrange(sds s, int start, int end);void sdsupdatelen(sds s);void sdsclear(sds s);int sdscmp(sds s1, sds s2);sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count);void sdsfreesplitres(sds *tokens, int count);void sdstolower(sds s);void sdstoupper(sds s);sds sdsfromlonglong(long long value);sds sdscatrepr(sds s, char *p, size_t len);sds *sdssplitargs(char *line, int *argc);


原创粉丝点击