14

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

我的文件有什么问题吗?我的数据库有大约 300 万个键,每个键的值是一个包含大约 80 个整数的列表。

我使用此方法将 3 个实例放在一起。

PS:另一个相同大小和相同键值结构的dump.rdb只消耗1GB内存。

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

4

2 回答 2

18

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

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

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

如果您想知道哪些对象占用了内存,请使用redis-rdb-tools来分析您的数据(免责声明:我是该工具的作者)。从那里,遵循redis.io 上的内存优化说明,以及redis-rdb-tools 上的内存优化 wiki 条目

于 2012-11-06T03:36:17.727 回答
0

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

于 2012-11-06T03:03:04.143 回答