Redis-压缩表-__ziplistDelete详解

/* 从位置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保存前一个结点的内存长度是否适合保存需要删除的第一个结点的前一个结点的长度,所以下面计算内存长度差值 */
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值