0

我们使用 Elasticache Redis 节点来存储数据。

所有密钥具有相同的格式:
- 密钥是 md5 哈希 - 128 位(16 个字节,32 个字符串字符字节)。
- 值为时间戳字符串 - 19 个字节。
总的来说,密钥大小是32+19=51 bytes

我们有84 917 361一百万把钥匙。
我假设 Redis shell 消耗的总内存接近84917361*51 = 4.03 gb.

实际上,需要11.07 gb.
命令输出infoused_memory_human:11.07G

  1. 剩下的内存用在什么上了7 gb
  2. 有没有办法存储md5为 16 个字节的哈希,而不是 32 个字符的字符串?

谢谢,非常感谢任何帮助。

4

1 回答 1

1

剩下的内存是什么,7 GB?

简短回答:Redis 不会将键和值存储为原始字符串

实际上,

  1. 密钥被包装成一个sdshdr结构(对于最新版本,它是一个更紧凑的结构),它有一些开销,例如字符串的长度。

  2. 该值被包装到一个redisObject结构中,该结构也有一些开销,例如对象编码、引用计数。

  3. 当 Redis 将一对插入到 dict 中时,还有其他开销,例如结构中的next指针和key指针dictEntry

所有这些开销都会消耗剩余的内存。

为了提高内存效率,可以参考@Kevin Christopher Henry提到的那篇文章(小哈希可以节省很多redisObject开销,可以ziplist用来让元素在内存中更紧凑)。

有没有办法将 md5 存储为 16 个字节的哈希,而不是 32 个字符的字符串?

使用哈希函数(例如 Murmurhash)为每个 md5 字符串创建摘要

这样就可以得到一个8字节(64位)的摘要。但是,您无法从Murmurhash摘要中获取原始 md5 字符串。所以如果你关心md5的值,你可以采取这种方法。

于 2017-01-23T02:53:47.050 回答