我有大约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字节?)以及我在上述配置设置中可以做些什么改变以实现内存使用量减少?
在上述命令中选择条目和值的值时应该注意什么?
答案 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倍。