user545424
user545424

Reputation: 16189

Are redis hashes kept in ziplist after changing hash-max-ziplist-entries?

I'm running a redis instance where I have stored a lot of hashes with integer fields and values. Specifically, there are many hashes of the form

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

I was initially running redis with the default values for hash-max-ziplist-entries:

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

and redis was using approximately 3.2 GB of memory.

I then changed these values to

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

and restarted redis. My memory usage went down to approximately 480 MB, but redis was using 100% CPU. I reverted the values back to 512 and 64, and restarted redis, but it was still only using 480 MB of memory.

I assume that the memory usage went down because a lot of my hashes were stored as ziplists. I would have guessed that after changing the values and restarting redis they would automatically be converted back into hash tables, but this doesn't appear to be the case.

So, are these hashes still being stored as a ziplist?

Upvotes: 3

Views: 2487

Answers (1)

user163596
user163596

Reputation: 41

They are still in optimized "ziplist" format.

Redis will store hashes (via "hset" or similar) in an optimized way if the hash does end up having more than hash-max-ziplist-entries entries, or if the values are smaller than hash-max-ziplist-values bytes. If these limits are broken Redis will store the item "normally", ie. not optimized.

Relevant section in documentation (http://redis.io/topics/memory-optimization):

If a specially encoded value will overflow the configured max size, Redis will automatically convert it into normal encoding.

Once the values are written in an optimized way, they are not "unpacked", even if you lower the max size settings later. The settings will apply to new keys that Redis stores.

Upvotes: 4

Related Questions