【问题标题】:Redis Data Structures Using up a lot of memoryRedis 数据结构占用大量内存
【发布时间】:2013-02-01 20:58:48
【问题描述】:

我在 Redis 中进行了一项实验,以测试大键的内存使用情况。我加载了 1600 万个字符串 50-60 个字符(字节),大致将磁盘上的 802 MB 放入 Redis 中的排序集中。它 此排序集已用完(膨胀到)3.12 GB 的 RAM

然后我加载了 1600 万个 短字符串(10-12 个字符),占用了 220 MB 磁盘空间 进入另一个仍然用完 2.5 GB RAM 的排序集。很明显,减少 磁盘上的空间使用率相当高(减少了约 72%),但 Redis 排序集仍然使用 大字符串使用了大量的内存。

Redis 哈希也是如此(短字符串几乎占用了 80% 长字符串使用的内存)。 Redis 数据结构使用的内存是否只依赖于 数据结构中元素的数量(排序集或散列),而不是长度 每个元素(这是很自然的想法 - 较短的字符串=>较少的内存)?

如果我能理解为什么就太好了

1600 万个长字符串占用几乎与 1600 万个短字符串相同的空间

排序集中,如果有什么我可以做的来减少短字符串占用的内存 (任何内存优化)?

【问题讨论】:

  • 快速(无答案)分析;数据大小的差异约为 600MB,内存需求的差异约为 600m,因此对于您添加的字符串数量,似乎存在一个与字符串长度无关的常数因子,约为 2.3GB。
  • 非字符串长度相关因素似乎不是恒定的,它确实取决于数据结构中元素的数量,这非常糟糕,因为它会随着数据结构变大而增长(更多元素数)!

标签: memcached redis in-memory-database in-memory


【解决方案1】:

这个问题和这个问题类似: Redis 10x more memory usage than data

有序集是 Redis 内存效率较低的数据结构。它被实现为字典和跳过列表。两种数据结构都包含许多元数据和指针(基于每个项目),其大小大于 10、12、50 或 60 字节。

字符串大小的 50 字节差异不会导致全局内存占用量有显着差异,因为大部分内存被指针、元数据和 internal fragmentation 使用。当然,更大的差异会导致更大的影响。

要利用内存优化,您需要拆分数据结构(如上述链接中所述)。使用散列或集合更容易做到这一点,而排序集合通常很难(或根本不可能)。

【讨论】:

  • 是否可以对 Redis.conf 进行任何更改以帮助我们?指针数组、redis 对象包装器等元数据字段似乎不可归约。 “实际数据本身(每个都以 8 个字节作为大小和容量的前缀)”我们可以优化前缀 8 个字节(因为我们知道字符串的大小最大 20 个字节)
  • 没有。所有的内存优化都在那里描述:redis.io/topics/memory-optimization 并且它们仅在对象很小时才有意义(即小散列、小集、小排序集等......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2014-05-11
  • 2011-02-27
  • 2013-12-13
相关资源
最近更新 更多