实际上,我有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条目.