/* 将长度为slen的字符串s插入到压缩表zl的位置p处 */
static unsigned char *__zipListInsert(unsigned char *zl, unsigned char *p,
unsigned char *s, unsigned int slen){
size_t curlen = intrev32ifbe(ZIPLIST_BYTES(zl)), reqlen, prevlen = 0;
size_t offset;
int nextdiff = 0;
unsigned char encoding = 0;
long long value = 123456789;
zlentry entry, tail;
/* 获得要插入的结点前置结点的长度,包含三种场景 */
/* 1)p不指向压缩表尾端,新结点插入p的位置,
所以p的前置结点的长度通过p指向的结点信息中可以获得 */
if (p[0] != ZIP_END) {
entry = zipEntry(p);
prevlen = entry.prevrawlen;
} else {
unsigned char *ptail = ZIPLIST_ENTRY_TAIL(zl);
/* 2)p指向压缩表的尾端,但是压缩表中结点不为空,
所以p的前置结点的长度是尾结点的长度 */
if (ptail[0] != ZIP_END){
prevlen = zipRawEntryLength(ptail);
}
/* 3)p指向压缩表的尾端,而且压缩表中结点为空,所以p的前置结点的长度是0,
Redis-压缩表-__ziplistInsert详解
最新推荐文章于 2024-02-26 00:23:54 发布