为什么500MB Redis dump.rdb文件需要大约5.0GB的内存?

wyp*_*wyp 13 redis

实际上,我有3个Redis实例,我把它们放在这个500MB + dump.rdb中.Redis服务器可以读取此dump.rdb,似乎一切正常.然后我注意到redis-server的内存成本超过5.0GB.我不知道为什么.

我的档案有什么问题吗?我的db有大约300万个键,每个键的值是一个包含大约80个整数的列表.

我使用这个方法将3个实例放在一起.

PS:另一个具有相同大小和相同键值结构的dump.rdb仅花费1GB内存.

我的数据看起来像keyNum - > {num1,num2,num3,......}.所有数字都在1到4,000,000之间.我应该使用List来存储它们吗?现在,我使用lpush(k,v).这种方式成本太高了吗?

Sri*_*nan 16

内存与转储大小的比率取决于Redis在内部使用的数据类型.

对于小对象(散列,列表和有序集),redis使用ziplists对数据进行编码.对于由整数组成的小集合,redis使用Intsets.ZipLists和IntSets 以与存储在内存中相同的格式存储在磁盘上.因此,如果您的数据使用这些编码,您可以期望1:1的比例.

对于较大的对象,内存中表示与磁盘上的表示完全不同.磁盘格式是压缩的,没有指针,不必处理内存碎片.因此,如果您的对象很大,则10:1的内存与磁盘比率是正常的并且是预期的.

如果您想知道哪些对象占用了内存,请使用redis-rdb-tools来分析您的数据.从那里,按照redis.io上内存优化说明,以及redis-rdb-tools上内存优化wiki条目.


Jos*_*ell 0

可能还有更多内容,但我相信 Redis 会压缩转储文件。