【问题标题】:Redis: Memory OptimizationRedis:内存优化
【发布时间】:2017-01-18 22:05:55
【问题描述】:

我有大约 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 字节吗?)以及我可以在上面的配置设置中对我的情况进行哪些更改以减少内存使用?

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

【问题讨论】:

  • 它们是列表吗?还是套装?
  • @KarthikeyanGopall 我将值存储在每个键的列表中,但我认为 set 更适合我的情况。
  • @RyanVincent 我问题中的前 7 个键是指每个键的整数计数。

标签: optimization redis key-value-store


【解决方案1】:

列表-最大-mipmap-条目 512: list-max-zipmap-value 64

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

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

要验证给定密钥是使用 ziplist 还是链表,请使用 OBJECTcommand。

更多详情请见Redis Memory Optimization

【讨论】:

    【解决方案2】:

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

    Redis 文档说,

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

    根据这种编码和解码将花费更多的时间/CPU 来处理这个巨大的数字。所以最好运行基准测试然后再决定。

    另一种建议,如果您只查找此集合以查看密钥是否可用。然后您可以将结构更改为存储桶之类的东西。

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

    Sadd key1:bucket:123 456
    

    123 = 123456/1000 456 = 123456%1000

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

    但是内存会减少到10倍左右。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 2019-06-22
      • 2010-11-15
      • 2013-10-11
      相关资源
      最近更新 更多