为什么说redis的ziplist节约内存

[复制链接]
查看11 | 回复6 | 2021-1-27 05:27:04 | 显示全部楼层 |阅读模式
为什么说redis的ziplist节约内存,看了他的数据结构,没catch到他节约内存这个点啊。大神们指点一下。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
数据是压缩后存储在内存的,所以节约了内存。但是增加了压缩/解压的开销
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
除了头和尾大部分都是数据,linkedlist是按照项最大的数据类型存的(每一个都是,为啥数据量大了变为linkedlist就不知道了)
相对于dict来说更好维护吧(只是因为数据量大了查询效率降低才变为dict)
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
变为linkedlist是因为他的数据太紧凑了,导致增改操作需要大量内存支持吧
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
这个压缩链表都在一块连续的空间上创建,碎片化的空间小了,不久节约了
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
64位系统双向链表一个节点prev和next指针就16字节了,ziplist主要省的内存就在这儿了
回复

使用道具 举报

千问 | 2021-1-27 05:27:04 | 显示全部楼层
typedefstructzlentry{
unsignedintprevrawlensize,prevrawlen;
unsignedintlensize,len;
unsignedintheadersize;
unsignedcharencoding;
unsignedchar*p;
}zlentry;
//这是zlentry的结构体
楼主的疑惑点应该是从上述结构体来看,一个zlentry占据的空间相较双向链表没有更少反而更多。
但是,从源码来看,__ziplistInsert函数进行新节点插入时,并不存储prevrawlensize/lensize,而在取节点时通过prerawlen/len去确定,再进行相应操作。
同时,在__ziplistInsert函数插入新节点时,会根据prerawlen/len的实际大小为这两个值分配存储空间。
//ziplist两方面节省内存:
-第一,之前的内容
-第二,分配大块内存减小内存碎片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行