更改hash-max-ziplist-entries后,redis哈希值是否保存在ziplist中?

时间:2014-09-07 22:01:07

标签: redis

我正在运行一个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的内存。

我认为内存使用率下降是因为我的很多哈希都存储为ziplists。我猜想在更改值并重新启动redis之后,它们会自动转换回哈希表,但似乎并非如此。

那么,这些哈希值是否仍然存储为ziplist?

1 个答案:

答案 0 :(得分:4)

他们仍在优化&#34; ziplist&#34;格式。

如果散列最终有超过hash-max-ziplist-entries个条目,或者值小于{{1>,Redis将以优化的方式存储散列(通过&#34; hset&#34;或类似)字节。 如果这些限制被破坏,Redis将存储项目&#34;通常&#34;,即。没有优化。

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

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

一旦以优化的方式写入值,即使您稍后降低最大尺寸设置,它们也不会被解压缩#34;这些设置将应用于Redis存储的新密钥。