博客
关于我
Redis源码分析(七)--- zipmap压缩图
阅读量:363 次
发布时间:2019-03-05

本文共 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??????????

  • zmlen?Zipmap???????????????254??????????????254????????Zipmap??????
  • len?????????????????????????????
  • free?????????????????????

Zipmap??????

Zipmap?????????????????????????????ZipmapSet????????

  • ??????

    • ??zipmapLookupRaw??????????????????????Zipmap????
    • ????????????????????????????????Zipmap????????????????
  • ??????

    • ?????????
    • ??Zipmap?????????????????????????????
  • ??????

    • ??Zipmap??????????
  • Zipmap????

    Zipmap???????????????????????????????254?????????????????Zipmap?????????

    Redis??????

    ?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?????????????????????????

    • ???????????????????????????????????
    • ???????????????????????????????????????
    • ???????????????????????????

    ??

    Zipmap???????????????????????????????????????????Redis??Hash???????????????????????????Zipmap????????????????Redis???????

    转载地址:http://hcng.baihongyu.com/

    你可能感兴趣的文章
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>