【发布时间】:2016-10-03 09:08:40
【问题描述】:
从文档中我们知道 redis 会压缩一个范围内的数据(默认为 512)。如果哈希范围超过 512,那么内存差异将是 10 倍。
我对 1 到 512 的哈希值做了一个小实验,发现了一些有趣的模式。
此图表示 1000 个散列占用的内存(以 KB 为单位),每个散列包含从 1 到 512 的条目。
正如您在此图中看到的那样。在某些时间间隔内存在陡峭。我理解 redis 中的哈希实现也遵循一些逻辑,当它达到一定范围时扩展大小,而不是为每个新条目增加它。从数字来看,它并没有始终遵循翻倍的模式,但是从 215 到 216 它确实翻了一番,从 4 MB 到 8 MB。从 420 到 421,它几乎增加了一半 8 MB 到 12 MB。在 215 内的陡坡中,我看不到它在 1/4、1/5 和 1/6 之间变化的任何模式。
根据我的观察,以下是我的问题:
- 谁能解释一下 hashmap 在内存和调整大小方面的内部情况?调整大小时遵循的逻辑是什么?
- 如果我不得不释放双倍内存来存储一个 215 到 216 的条目,为什么我不能限制我的应用程序的哈希值始终小于 215,除非系统最多需要它.
- 假设如果我想存储 100 万个散列,每个散列包含 250 个值,我需要 800MB。如果我将它们分成 125 个值的 2 个哈希值,即 125 个值的 200 万个哈希值,我需要 500MB。通过这种方式,我节省了 300 MB,这是巨大的!!这个计算对吗?在这种情况下我错过了什么吗?
提前致谢
【问题讨论】:
-
我知道这与这个问题无关,但是您是否尝试过设置技术来减少数据占用?
-
@Karthikeyan Gopall,我认为最好再提供两个细节: 1. 你是如何使用内存的?使用 redis-cli 获取 'info Memory' 并获取字段 ''used_memory" 或 "used_memory_rss" 或其他地方的值 2. 你可以通过 "./redis-cli info |grep mem_allocator" 获得的内存分配器跨度>
-
@sel-fish 1) 我会从“used_memory”中得到它。在开始这个过程之前我会使用used_memory,在这个过程之后我会做同样的事情,它们的区别就是我在图中提到的。 2) mem_allocator:jemalloc-3.6.0