【问题标题】:Why a 500MB Redis dump.rdb file takes about 5.0GB memory?为什么一个 500MB 的 Redis dump.rdb 文件需要大约 5.0GB 的内存?
【发布时间】:2012-10-25 23:21:23
【问题描述】:

实际上,我有 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)。这种方式是不是太贵了?

【问题讨论】:

    标签: redis


    【解决方案1】:

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

    对于小对象(散列、列表和排序集),redis 使用 ziplist 对数据进行编码。对于由整数组成的小集合,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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,它压缩数据。 500MB 到 5.0GB,我现在无法启动我的程序 :-(
      猜你喜欢
      • 2012-06-26
      • 2013-07-16
      • 1970-01-01
      • 2021-08-25
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      相关资源
      最近更新 更多