/* 从位置p开始,连续删除num个结点
返回删除结点之后的压缩表 */
static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsigned int num) {
unsigned int i, totlen, deleted = 0;
size_t offset;
int nextdiff = 0;
zlentry first, tail;
/* 计算被删除结点占用内存数 */
first = zipEntry(p); /* 利用first.p保存p结点的位置,而没有额外设置一个变量保存p位置 */
for (i = 0; p[0] != ZIP_END && i < num; i++) {
p += zipRawEntryLength(p); /* 函数zipRawEntryLength功能:计算p位置的结点占用的内存数 */
deleted++; /* 统计可删除的结点数,可能在删除num结点之前,p位置已经到达压缩表表尾,此时deleted < num */
} /* 循环结束之后,p指向需要删除的所有结点的下一个结点的位置 */
totlen = p - first.p; /* totlen表示需要删除的内存字节数 */
if (totlen > 0) { /* 需要删除的内存字节数必须大于0才会进行处理 */
if (p[0] != ZIP_END) { /* p指向一个有效结点,即需要删除的结点之后还有结点 */
/* 需要判断p保存前一个结点的内存长度是否适合保存需要删除的第一个结点的前一个结点的长度,所以下面计算内存长度差值 */
Redis-压缩表-__ziplistDelete详解
最新推荐文章于 2024-06-18 15:59:25 发布