我正在运行一个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?
答案 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存储的新密钥。