我在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万个短字符串相同
排序集中的,如果我有什么办法可以减少短字符串占用的内存 (任何内存优化)?
答案 0 :(得分:4)
这个问题类似于这个问题: Redis 10x more memory usage than data
排序集是Redis的内存效率较低的数据结构。它被实现为字典加上跳过列表。这两种数据结构都涉及许多元数据和指针(基于每个项目),其大小高于10,12,50或60字节。
字符串大小的50个字节差异不会导致全局内存占用量的显着差异,因为大多数内存都由指针,元数据和internal fragmentation使用。当然,较大的差异会导致更大的影响。
要利用内存优化,您需要拆分数据结构(如上面的链接所述)。使用散列或集合更容易实现,并且对于有序集合通常很难(或根本不可能)。