sds(簡單動態字串)是redis底層的字串表示,它具有字串對象化和替代char*的作用。資料庫中的實值型別包括字串,雜湊表,列表,集合和有序集合,但是鍵類型卻總是字串。
typedef char *sds;struct sdshdr {// buf 已佔用長度int len;// buf 剩餘可用長度int free;// 實際儲存字串資料的地方char buf[];};
redis構建了自己的類型系統,所有的鍵、值、參數都是有類型的,在redis中用redisObject結構表示:
/** Redis 對象*/typedef struct redisObject {// 類型unsigned type:4;// 對齊位unsigned notused:2;// 編碼方式unsigned encoding:4;// LRU 時間(相對於server.lruclock)unsigned lru:22;// 引用計數int refcount;// 指向對象的值void *ptr;} robj;
string類型的每個具體值都由一個redisObject進行描述,它可以表示一個字串或整數,分別使用REDIS_ENCODING_INT 和REDIS_ENCODING_RAW 兩種編碼(redis不直接儲存資料結構而是通過編碼轉化成記憶體映射模型使用)。前者用於儲存long類型資料,後者用來儲存sds/char*,long long,long double,double類型資料。字串類型基本上就是通過sds資料結構的操作函數來實現的,這裡僅舉個簡單例子,其它沒啥好說的。
/* * 在指定字串後追加字串並指明增加的記憶體空間 */sds sdscatlen(sds s, const void *t, size_t len) {//申明字串sh struct sdshdr *sh;//擷取參數s的長度 size_t curlen = sdslen(s);//為s新增記憶體空間 s = sdsMakeRoomFor(s,len);//未分配成功則返回null if (s == NULL) return NULL;//使sh指向重新分配記憶體後的s的基址 sh = (void*) (s-(sizeof(struct sdshdr)));//將t複製到s的結尾 memcpy(s+curlen, t, len);//設定sh的長度變數和剩餘可用長度 sh->len = curlen+len; sh->free = sh->free-len;//末尾添加‘\0’結尾符 s[curlen+len] = '\0'; return s;}