本文共 2560 字,大约阅读时间需要 8 分钟。
Redis??Zipmap??????????????????????????????ziplist?????????Zipmap????????????????????????????????????????????????????????????????????????????????
Zipmap????????????????????????????????Zipmap???
1 < len>3< free>0< value>"foo"< len>3< free>0< value>"bar"< len>5< free>0< value>"hello"< len>5< free>0< value>"world"
Zipmap??????????
Zipmap?????????????????????????????ZipmapSet????????
??????
zipmapLookupRaw??????????????????????Zipmap??????????
??????
Zipmap???????????????????????????????254?????????????????Zipmap?????????
?Redis??Hash???????????????????Zipmap???????Zipmap?????????????????????
????????Zipmap?????
unsigned char *zipmapSet(zm, key, klen, val, vlen, update) { unsigned int zmlen, offset; unsigned int freelen, reqlen = zipmapRequiredLength(klen, vlen); unsigned char *p; freelen = reqlen; if (update) *update = 0; p = zipmapLookupRaw(zm, key, klen, &zmlen); if (p == NULL) { zm = zipmapResize(zm, zmlen + reqlen); p = zm + zmlen - 1; zmlen += reqlen; if (zm[0] < ZIPMAP_BIGLEN) zm[0]++; } else { if (update) *update = 1; freelen = zipmapRawEntryLength(p); if (freelen < reqlen) { offset = p - zm; zm = zipmapResize(zm, zmlen - freelen + reqlen); p = zm + offset; memmove(p + reqlen, p + freelen, zmlen - (offset + freelen + 1)); zmlen = zmlen - freelen + reqlen; freelen = reqlen; } } empty = freelen - reqlen; if (empty >= ZIPMAP_VALUE_MAX_FREE) { offset = p - zm; memmove(p + reqlen, p + freelen, zmlen - (offset + freelen + 1)); zmlen -= empty; zm = zipmapResize(zm, zmlen); p = zm + offset; vempty = 0; } else { vempty = empty; } p += zipmapEncodeLength(p, klen); memcpy(p, key, klen); p += klen; p += zipmapEncodeLength(p, vlen); *p++ = vempty; memcpy(p, val, vlen); return zm;} Zipmap?????????????????????????
Zipmap???????????????????????????????????????????Redis??Hash???????????????????????????Zipmap????????????????Redis???????
转载地址:http://hcng.baihongyu.com/