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

标签 redis

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

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

我用这个METHOD将 3 个实例放在一起。

PS:另外一个dump.rdb,同样大小,同样key-value结构,只占用1GB内存。

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

最佳答案

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

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

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

如果你想知道哪些对象占用内存,使用redis-rdb-tools分析您的数据(免责声明:我是该工具的作者)。从那里,按照 memory optimization notes on redis.io ,以及 memory optimization wiki entry on redis-rdb-tools .

关于redis - 为什么一个 500MB 的 Redis dump.rdb 文件需要大约 5.0GB 的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243701/

相关文章:

python - 处理概率变化系统的高效算法

redis - HiRedis::如何使用 LPUSH 在 Redis 列表中插入一个空字符串

unit-testing - 在 Spring Boot Camel 中模拟 RedisTemplate

ruby-on-rails - Rails 5.2 和 Sidekiq : Can't find Worker Class

redis - Redis 是如何工作的?

redis - 一定要先获取Length of List,然后在Redis中查询List吗?

java - 在 Redis 上放置 Java 对象 : is JavaNode a correct approach?

ruby-on-rails - redis 无法连接到 rails (ECONNREFUSED)

amazon-web-services - CodeIgniter 3 Redis 支持的 session 性能和可扩展性

redis - 更简洁的Redis启动日志