Redis:内存优化

时间:2016-09-11 07:35:17

标签: optimization redis key-value-store

我有大约256个键。对于每个键,我必须存储大量非复制整数。 以下是前7个键,每个键的总值(条目数)。每个值都是一个具有较大值的唯一整数。

Key     No. of integers (values) in the list
Key 1   3394967
Key 2   3385081
Key 3   2172866
Key 4   2171779
Key 5   1776702
Key 6   1772936
Key 7   1748858

默认情况下,Redis在存储此数据时会占用大量内存。我读到,更改以下参数会导致内存使用率大幅降低。

list-max-zipmap-entries 512 
list-max-zipmap-value 64 

任何人都可以向我解释一下这些配置命令(512和64字节?)以及我在上述配置设置中可以做些什么改变以实现内存使用量减少?

在上述命令中选择条目的值时应该注意什么?

2 个答案:

答案 0 :(得分:1)

list-max-mipmap-entries 512: list-max-zipmap-value 64

如果List中的条目数超过512,或者列表中任何给定元素的大小> 64字节,Redis将切换到效率较低的内存存储结构。更具体地说,低于这些阈值,它将使用一个ziplist,在它上面将使用一个链表。

因此,在您的情况下,您需要使用>的条目值1748858看到任何变化(然后只在键8端)。另请注意,为了让Redis将它们重新编码为较小的对象大小,您还需要在配置中进行更改并重新启动Redis,因为它不会自动重新编码。

要验证给定密钥是否使用ziplist与链接列表,请使用OBJECT命令。

有关详细信息,请参阅Redis Memory Optimization

答案 1 :(得分:1)

IMO你无法实现redis'内存优化。在您的情况下,每个列表/集中的条目大约为300万。如果将list-max-zipmap-entries的值赋予300万,则为了实现内存优化。

Redis doc说,

  

对于小值,此操作非常快,但如果更改了   设置为了使用特殊编码的值更大   聚合类型建议是运行一些基准测试和测试   检查转换时间。

根据这种编码和解码,这个庞大的数字需要更多的时间/ CPU。因此,最好先运行基准测试,然后再做出决定。

一个替代建议,如果您只查找此设置以查看密钥是否可用。那么你可以将结构更改为桶类的东西。

例如,设置为key1的值123456可以像这样存储

Sadd key1:bucket:123 456

123 = 123456/1000 456 = 123456%1000

如果您想要检索key1的所有值,请注意这不会起作用。在这种情况下,您将循环遍历1000组。类似于key1的总大小,你必须循环1000键。

但是记忆将减少到大约10倍。