我的问题示例:HMSET myhash field1 value1 field2 value2
和myhash仅具有这两个字段。
主要问题是如何计算hash-max-ziplist-value
,以使我的哈希值不超过将哈希值保持为压缩格式以最小化内存使用的值。
非常感谢“凯文·克里斯托弗·亨利”的详细解释,帮助和时间。由于英语有限,我将在这里总结Kevin的答案。如果我理解的地方不对,请纠正我。
(1)为了满足hash-max-ziplist-value
,我需要计算max(field1
,value1
,field2
,value2
)。假设value1
具有最大的大小。然后,我只需要确保value1
的大小不超过hash-max-ziplist-value
。
(2)要计算value1
,我只需要计算大小的字节数。因为hash-max-ziplist-value
是压缩前字符串值的字节数。
(3)要计算value1
的字节数,有很多方法,其中一种方法如下:首先,将value1
转换为UTF8编码(如果不是)。其次,使用客户端语言检查其长度。因为UTF8编码的字符串的长度是Size中的字节数。 (例如:utf8.encode(value1).length
)。
例如,HMSET myhash field1 value1 field2 value2
hash-max-ziplist-entries
的真正含义。上面的示例是一个条目还是两个条目,因为它具有两个字段?
hash-max-ziplist-value
?是(a)MEMORY USAGE myhash
(b)field1
,value1
,field2
,value2
的总大小
(c)value1
和value2
的总和。
(d)max(value1
,value2
)吗?
(e)max(field1
+ value1
,field2
+ value2
)
hash-max-ziplist-value
匹配的哈希值。 hash-max-ziplist-value
是字节数吗?那是utf-8编码的字符串长度吗? Redis中是否存在用于此计算的现有命令?非常感谢您的帮助。
答案 0 :(得分:1)
这些值在redis.conf
文件和memory optimization documentation中进行了简要说明。
#哈希在具有哈希值的情况下使用内存有效的数据结构进行编码
#条目数量少,最大条目不超过给定
#门槛。可以使用以下指令配置这些阈值。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
以这些默认值为例,如果散列具有512个或更少的条目,并且每个条目的大小为64个字节或更小,则将使用ziplist对散列进行编码。
尽管文档没有确切说明散列条目的大小如何计算,但查看the source code时表明字段名和值的大小都必须小于或等于阈值。您应该能够通过计算二进制字符串的长度(以字节为单位)来确定大小。
要回答您的一些特定问题:
上面的示例是一个条目还是两个条目,因为它具有两个字段?
两个。
什么是
hash-max-ziplist-value
?
使用您的术语,max(field1, value1, field2, value2)
。
是utf-8编码的字符串计算吗?
Redis使用二进制字符串。由您(或您的客户)决定使用哪种编码。
是否有任何简便的方法来计算
hash-max-ziplist-value
的myhash值(以字节为单位)? Redis中是否存在用于此计算的命令?
我不知道,但是该值的二进制字符串表示形式的长度应该大致正确。