Redis数据结构占用了大量内存

3

我在Redis中运行了一个实验来测试大型键的内存使用情况。我将1600万个字符串加载到Redis的排序集中,每个字符串有50-60个字符(字节),在磁盘上占用802 MB的空间。对于这个排序集,它占用了(膨胀到)3.12 GB的RAM

然后我将1600万个短字符串(10-12个字符)加载到另一个排序集中,这些字符串在磁盘上占用220 MB的空间,但Redis仍然使用2.5 GB的RAM。很明显,磁盘空间使用量降低得相当高(约降低72%),但Redis排序集仍然使用相当大量的内存用于长字符串。

Redis散列也是如此(短字符串使用长字符串所使用内存的80%)。Redis数据结构使用的内存只取决于数据结构(排序集或散列)中的元素数量是否只与每个元素的长度无关(思考自然会认为较短的字符串 => 占用更少的内存)?

如果我能够理解为什么:

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

排序集中,并且是否有任何方法可以减少短字符串占用的内存(任何内存优化)?


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

4

这个问题与Redis 10x more memory usage than data类似。

有序集合是Redis中内存效率较低的数据结构。它由一个字典和一个跳跃列表实现。这两种数据结构都涉及到一些元数据和指针(每个项都有),其大小高达10、12、50或60个字节以上。

字符串大小相差50个字节不会在全局内存占用上产生显著的差异,因为大部分内存都是由指针、元数据和内部碎片所占用的。当然,更大的差异会产生更大的影响。

为了利用内存优化,您需要拆分数据结构(如上面的链接所述)。使用哈希表或集合更容易实现,而对于有序集合来说通常很困难(或根本不可能)。


有没有Redis.conf的任何更改可以帮助我们?元数据字段,如指针数组、Redis对象包装器似乎无法减少。“实际数据本身(每个都以8个字节的大小和容量为前缀)”我们能否在前缀的8个字节上进行优化(因为我们知道字符串的最大长度为20个字节)? - alpha_cod
不需要。所有的内存优化都在这里描述:http://redis.io/topics/memory-optimization,只有当对象很小(即小哈希、小集合、小排序集等)时才有意义。 - Didier Spezia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接