我仔细阅读了https://redis.io/topics/memory-optimization,但我仍然感到困惑。基本上,它表示限制每个哈希映射中的键数(HSET
)。但是每个 HSET中的键数呢。
如果我有1,000,000个密钥用于某个前缀。每一个都具有独特的价值。假设它们的整数看起来像"12345689"
。如果我通过取前两个字符(例如"12"
)并将余数作为“子密钥”(例如"3456789"
)来“分割”密钥,那么对于每个哈希,我将拥有1,000,000 / 100 =每个10,000个键(理论上)。这太多了吗?
我的(默认)配置是:
redis-store:6379> config get hash-*
1) "hash-max-ziplist-entries"
2) "512"
3) "hash-max-ziplist-value"
4) "64"
因此,如果我每个前缀每个1,000,000个密钥,我将小于512 。实际上,我将有100(例如"12"
或"99"
)。但是每个人呢?理论上每个键有10,000个键。这是否意味着我打破了限制,无法从哈希映射提供的空间优化中受益?
答案 0 :(得分:2)
您可以使用此公式计算每个密钥的HASH
内部数据开销:
3 * next_power(n)* size_of(指针)
n
中有HASH
个密钥。我认为您使用的是Redis
的x64版本,因此size_of(指针)为8.因此,对于HASH
中的每10,000个密钥,您将至少有240,000字节的开销。
<强>已更新强>
请注意hash-max-ziplist-entries
不是银弹。请查看这里的文章Under the hood of Rdis #2 - ziplist可以计算为21 * n并且同时:保存到х10RAM,您的写入速度下降最多可达30次,最多可达100次读取。因此,在HASH中总共有1,000,000个条目,您可以通过性能来捕获关键细分
您可以阅读有关Redis HASH
内部Under the hood of Redis #1的更多信息。
答案 1 :(得分:0)
经过一番广泛的研究后,我终于明白hash-max-ziplist-entries
是如何运作的。
https://www.peterbe.com/plog/understanding-redis-hash-max-ziplist-entries
基本上,它只是一个哈希映射,或者如果你需要存储多于=choose(--left(a1), "", "", "", "AA", "", "", "BB")&mid(a1, 2, len(a1))
设置的密钥,你需要将它分解为多个哈希映射。