【问题标题】:How to calculate hash-max-ziplist-value properly?如何正确计算 hash-max-ziplist-value?
【发布时间】:2019-06-07 18:13:59
【问题描述】:

我的问题示例:HMSET myhash field1 value1 field2 value2 和 myhash 只有这两个字段。

主要问题是如何计算hash-max-ziplist-value,这样我的哈希值不会超过保持我的哈希值在压缩格式中以最小化内存使用。

非常感谢“Kevin Christopher Henry”的详细解释、帮助和时间。由于我的英语有限,我将在这里总结凯文的答案。如果我的理解有误,请纠正我。

(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)field1value1field2value2的总大小

(c) value1value2 的总大小。

(d) 最大值(value1, value2)?

(e) 最大值(field1+value1, field2+value2)

  • 我不知道如何计算我的哈希值以匹配hash-max-ziplist-valuehash-max-ziplist-value 是字节数吗?那是 utf-8 编码的字符串长度吗? redis 中是否有用于此计算的现有命令?

非常感谢您的帮助。

【问题讨论】:

    标签: redis


    【解决方案1】:

    这些值在redis.conf 文件以及memory optimization documentation 中有简要说明。

    # 当哈希值具有
    # 条目数量少,最大条目不超过给定
    # 临界点。可以使用以下指令配置这些阈值。
    hash-max-ziplist-entry 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 中是否有用于此计算的现有命令?

    我不知道,但值的二进制字符串表示的长度应该是大致正确的。

    【讨论】:

    • 非常感谢您的回答。现在,我只是不知道如何计算 value1 或 value2 的大小。你说那将是一个二进制字符串表示。那么如何在redis中计算二进制字符串表示?谢谢。
    • @sgon00:你说的“in redis”是什么意思?如果您的目标是确保满足 ziplist 的要求,大概您想知道值的大小发送到 Redis 之前。你如何做到这一点取决于你的编程语言、客户端等。
    • @sgon00:例如,在 Python 中,您可能会使用 len("value".encode("utf-8"))
    • 是的,我只是想确定它是否符合要求。我认为要求是redis中二进制字符串的大小而不是字符串的长度。因此(1)我只计算字符串的长度吗?我刚读了你的新评论。看来我错了。我不需要计算redis中的二进制字符串大小,而是只需要计算长度。 (2) 我必须把它转换成utf-8吗?我将使用godart。我认为 go 使用 utf-8 而 dart 使用 utf-16。非常感谢。
    • @sgon00:我在答案中添加了一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多