Redis zipmap内存布局分析-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Redis zipmap内存布局分析

2016-02-18 14:50:05 2006 1

Redis被称为key/value应用中的瑞士军刀,除了其丰富的数据结构支持,更重要的是高效的内存使用,分析源码可以发现作者使用每一个 byte都精打细算。
在hashtable实现中,Redis引入了zipmap数据结构,保证在hashtable刚创建以及元素较少时,用更少的内存 来存储,同时对查询的效率也不会受太大的影响。
求各位大神给个案例,分析一下布局。

取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 18:43:58

    先来看一下zipmap提供的和存储相关的3个API:
    zipmapNew:创建一个zipmap字符串。zipmap创建时只有2个字节,后面会随着set和delete操作动态扩展和收缩。
    zipmapSet: 加入新的key/value或者修改zipmap中已有key对应的value。
    zipmapDel:从zipmap中删除key/value。
    下面给出一段伪代码并分析其内存布局的变化,如下图:
    1.zipmapNew();
    2.zipmapSet(key1,value1);
    3.zipmapSet(key2,value2);
    4.zipmapSet(key1,value3);
    5.zipmapDel(key2);
    6.zipmapSet(key1,value4);
    17
    1. zipmapNew()
    创建一个zipmap结构体,包含两个字节,第一个字节(zmlen)是长度为1个字节的无符号整数,用来保存zipmap当前元素个数(而非字符 串长度)。当zipmap的元素个数大于等于254时,zmlen将不再起作用,zipmap需要遍历整个字符串来获取当前元素个数。最后一个字节为 255,表示zipmap的结束。
    2. zipmapSet(key1, value1)
    一个元素(key/value)在zipmap中有5部分组成: 。
    表示紧跟其后的string(key或者value)的长度。如果string的长度小于254(这里代码和注释不统一,注释是253,但代码是254,以代码为准),用一个字节就可以表示(254和255有特殊含义),如果string的长度大于等于254,需要5个字节来表示,第一个字节设置为254,紧跟其后的4个字节通过编码(按主机字节序)来表示的值。zipmapEncodeLength和zipmapDecodeLength就是用来对进行编解码的。和是char型string,在第6步进行说明。
    3. zipmapSet(key2, value2)
    调用zipmapSet加入新的key/value时,zipmap将根据key2/value2的长度调用zipmapResize扩展空间,并将key2/value2插入到新分配的空间。同时将zipmap元素的个数加1(如果小于254)。
    4. zipmapSet(key1,value3)
    调用zipmapSet对已有的key修改其value,且新的value值大于现有value占用的空间时(加free的空间),zipmap将 再次调用zipmapResize扩展空间,并调用memmove将key1/vaule1之后的字符串向后顺移。这里只调用一次memmove,不会对 性能有太大影响。
    5. zipmapDel(key2)
    调用zipmapDel删除key2/value2时,zipmap将把key2/value2之后的字符串前移,并调用zipmapResize收缩占用的内存空间。同时将zipmap元素个数减1。
    6. zipmapSet(key1, value4)
    调用zipmapSet对已有的key1修改其value,且新的value值小于现有value占用的空间时,zipmap不会马上去调用 zipmapResize做内存空间收缩,而是将空闲字节数存入free中,用于后面对这个key再次修改value时,避免调用 zipmapResize(要根据新value的长度而定)。当然free的空间也不能太多,否则会造出空间的浪费。zipmap在free字节数大于等 于ZIPMAP_VALUE_MAX_FREE(代码中定义为4)时,就对free的空间进行收缩。

    0 0
相关问答

10

回答

【精品问答合集】Hbase热门问答

hbase小能手 2019-05-29 14:37:26 120767浏览量 回答数 10

38

回答

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

xiaofanqie 2014-12-25 15:13:38 92061浏览量 回答数 38

19

回答

[@倚贤][¥20]学习Java后端的疑惑

小江同志 2018-10-24 16:11:21 132504浏览量 回答数 19

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 295465浏览量 回答数 110

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 259792浏览量 回答数 38

62

回答

磁盘原地扩容功能4月22日正式上线

艳馨 2015-04-21 23:40:33 96347浏览量 回答数 62

23

回答

【精品问答合集】Redis热门问答

李博 bluemind 2019-05-29 16:36:15 127029浏览量 回答数 23

2

回答

区域选择帮助

fanyue88888 2012-12-07 15:54:30 204366浏览量 回答数 2

11

回答

【精品问答合集】MongoDB热门问答

李博 bluemind 2019-05-29 16:50:19 121295浏览量 回答数 11

13

回答

【精品问答合集】Java热门问答

李博 bluemind 2019-05-29 16:00:45 125514浏览量 回答数 13
+关注
落地花开啦
喜欢技术,喜欢努力的人
0
文章
7824
问答
问答排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载