上一篇,講了基本的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的已經分配的空間的字節數