【问题标题】:Are redis hashes kept in ziplist after changing hash-max-ziplist-entries?更改 hash-max-ziplist-entries 后,redis 哈希是否保留在 ziplist 中?
【发布时间】:2014-09-07 22:01:06
【问题描述】:

我正在运行一个 redis 实例,其中存储了许多带有整数字段和值的哈希值。具体来说,有很多散列形式

{1: <int>, 2: <int>, ..., ~10000: <int>}

我最初使用 hash-max-ziplist-entries 的默认值运行 redis:

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

redis 使用了大约 3.2 GB 的内存。

然后我将这些值更改为

hash-max-ziplist-entries 10240
hash-max-ziplist-value 10000

并重新启动redis。我的内存使用量下降到大约 480 MB,但 redis 使用了 100% 的 CPU。我将值恢复为 512 和 64,并重新启动了 redis,但它仍然只使用了 480 MB 的内存。

我假设内存使用量下降了,因为我的很多哈希都存储为 ziplist。我猜想在更改值并重新启动 redis 后,它们会自动转换回哈希表,但事实并非如此。

那么,这些哈希是否仍以 ziplist 的形式存储?

【问题讨论】:

    标签: redis


    【解决方案1】:

    它们仍然是优化的“ziplist”格式。

    如果哈希最终包含多个 hash-max-ziplist-entries 条目,或者值小于 hash-max-ziplist-values 字节,Redis 将以优化的方式存储哈希(通过“hset”或类似方式)。 如果这些限制被打破,Redis 将“正常”存储项目,即。未优化。

    文档中的相关部分 (http://redis.io/topics/memory-optimization):

    如果特殊编码的值会溢出配置的最大大小,Redis 会自动将其转换为正常编码。

    一旦以优化的方式写入值,它们就不会“解包”,即使您稍后降低最大大小设置也是如此。这些设置将应用于 Redis 存储的新密钥。

    【讨论】:

    • 将哈希表优化回 ziplist 后可能会出现高 CPU,这可能是在 ziplist 中查找时的 CPU 开销,因为与 10K 大尺寸的实际哈希表不同,它们效率低
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多