我们使用Elasticache Redis节点来存储数据。
所有按键的格式相同:
- 键是md5哈希 - 128位(16个字节,32个字符串字符)
- 值是时间戳字符串 - 19个字节
密钥总大小为32+19=51 bytes
我们有84 917 361
百万的钥匙
我假设,Redis shell消耗的总内存接近84917361*51 = 4.03 gb
。
实际上,它需要11.07 gb
输出info
命令:
used_memory_human:11.07G
7 gb
?md5
存储为16个字节的哈希值,而不是包含32个字符的字符串?谢谢,非常感谢任何帮助。
答案 0 :(得分:1)
关于内存的剩余部分,7 gb?
简答: Redis不会将密钥和值存储为原始字符串。
事实上,
密钥被包装成sdshdr
结构(对于最新版本,它是一个更紧凑的结构),它有一些开销,例如字符串的长度。
该值被包装到redisObject
结构中,该结构也有一些开销,例如对象编码,refcount。
当Redis将一对插入dict时,还有其他开销,例如: next
结构中的key
指针和dictEntry
指针。
所有这些开销都消耗了剩余的内存。
为了提高内存效率,你可以参考@Kevin Christopher Henry提到的文章(小哈希可以节省大量redisObject
开销,并且可以使用ziplist
使内存中的元素更紧凑。)
有没有办法将md5存储为16字节哈希,而不是32字符的字符串?
使用哈希函数(如Murmurhash)为每个md5字符串创建摘要。
通过这种方式,您可以获得8字节(64位)摘要。但是,您无法从Murmurhash
摘要中获取原始md5字符串。因此,如果你不关心md5的值,你可以采用这种方法。