redis - sds 之前本来跟着付磊团队在redis组做开发,要做技术分享,所以写了这个文章,后来发生组织架构变动去做自研缓存kcache了。但这篇sds实现还是可以沉淀一下。
总体代码逻辑清晰简单,过一遍重要结构
sds内存结构 1 2 3 4 5 6 7 typedef char *sds;struct __attribute__ ((__packed__ )) sdshdr8 { uint8_t len; uint8_t alloc; unsigned char flags; char buf[]; };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 sds sdsnewlen (const void *init, size_t initlen) { void *sh; sds s; char type = sdsReqType(initlen); int hdrlen = sdsHdrSize(type); unsigned char *fp; sh = s_malloc(hdrlen+initlen+1 ); if (sh == NULL ) return NULL ; if (init==SDS_NOINIT) init = NULL ; else if (!init) memset (sh, 0 , hdrlen+initlen+1 ); s = (char *)sh+hdrlen; fp = ((unsigned char *)s)-1 ; switch (type) { ... case SDS_TYPE_8: { SDS_HDR_VAR(8 ,s); sh->len = initlen; sh->alloc = initlen; *fp = type; break ; } ... } ... s[initlen] = '\0' ; return s; }
object - sds内存结构 1 2 3 4 5 6 7 8 9 10 typedef struct redisObject { unsigned type:4 ; unsigned encoding:4 ; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
1 2 3 4 5 6 7 8 #define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44 robj *createStringObject (const char *ptr, size_t len) { if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT) return createEmbeddedStringObject(ptr,len); else return createRawStringObject(ptr,len); }