zipmap是用连续内存保存key,value对的结构;
因为是连续内存保存的,所以每次插入或删除操作都可能会导致重新分配内存;
为了缓解重新分配内存压力,为每个value保留一个free字段,表明可用空闲字节数(4);
存储结构:
<zmlen><len>"foo"<len><free>"bar"<len>"hello"<len><free>"world"<ZIPMAP_END>
- zmlen表示key,value对数目,如果该数目大于或等于254,得遍历整个map才能得到key,value对数目;
- len表示key或value的长度,如果len<254,则用一个字节表示,否则,用五个字节表示,第一个字节为254,接下来四个字节存储长度;
- free是一个字节,存储在value后面有多少预留的空闲字节可用;
每次查询key对应的value,都得遍历zipmap;
插入、删除元素也得move及重新分配内存;
当插入元素存在且既有内存符合要求(放得下且不会浪费太多)时,不需要重新分配内存;