Redis研究-2.簡單動態字符串操做

上一篇,講了基本的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;
}




一樣,在這個頭文件中,申明瞭不少函數,分別是: spa

sds sdsnewlen(const void *init, size_t initlen);//用指定的char *字符指針和指定的長度來建立一個Redis sds
sds sdsnew(const char *init);//用指定的char *init 來建立一個Redis sds
sds sdsempty(void);//建立一個空的Redis sds
size_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)));//
#else
sds sdscatprintf(sds s, const char *fmt, ...);//打印人一個字符串,並將字符串添加到sds的末尾
#endif

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,按照閉區間的索引來截取
void sdsupdatelen(sds s);//重分配len和free
void sdsclear(sds s);//在不釋放sds的空間的狀況下,將sds保存的內容重置爲空字符
int sdscmp(const sds s1, const sds s2);//比較兩個sds
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);//用分隔符sep來分割s
void sdsfreesplitres(sds *tokens, int count);//釋放sds數組中的count個sds
void sdstolower(sds s);//將sds中的內容轉化爲小寫
void sdstoupper(sds s);//將sds中的內容轉化爲大寫
sds sdsfromlonglong(long long value);//根據輸入的long long value值來建立一個sds
sds 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的已經分配的空間的字節數
相關文章
相關標籤/搜索