实际上,我有3个Redis实例,我将它们放在这个500MB + dump.rdb中。 Redis服务器可以读取此dump.rdb,似乎一切正常。然后我注意到redis-server的内存成本超过5.0GB。我不知道为什么。
我的档案有什么问题吗?我的数据库有大约300万个密钥,每个密钥的值是一个包含大约80个整数的列表。
我使用此METHOD将3个实例放在一起。
PS:另一个具有相同大小和相同键值结构的dump.rdb仅花费1GB内存。
我的数据看起来像keyNum-> {num1,num2,num3,......}。所有数字都在1到4,000,000之间。我应该使用List来存储它们吗?现在,我使用lpush(k,v)。这种方式成本太高了吗?
答案 0 :(得分:16)
内存与转储大小的比率取决于Redis在内部使用的数据类型。
对于小对象(散列,列表和有序集),redis使用ziplists对数据进行编码。对于由整数组成的小集合,redis使用Intsets。 ZipLists和IntSets以与存储在内存中相同的格式存储在磁盘上。因此,如果您的数据使用这些编码,您会期望1:1的比例。
对于较大的对象,内存中表示与磁盘上的表示完全不同。磁盘格式是压缩的,没有指针,不必处理内存碎片。因此,如果您的对象很大,则10:1的内存与磁盘比率是正常的并且是预期的。
如果您想知道哪些对象占用了内存,请使用redis-rdb-tools来分析您的数据。从那里开始,请关注memory optimization notes on redis.io以及memory optimization wiki entry on redis-rdb-tools。
答案 1 :(得分:0)
可能还有更多,但我相信Redis会压缩转储文件。