Redis内存优化建议

问题描述 投票:0回答:2

我有一个Redis Master和2个奴隶。所有3个目前都在同一个unix服务器上。 3个实例使用的内存大约为3.5 G,3 G,3G。 redis db中有大约275000个密钥。大约有4000个哈希。 1套有100000个值。 1列表中有275000个键。它是一个哈希和集合列表。服务器的总内存为16 GB。目前使用9.5 GB。持久性目前已经过时。 rdb文件通过强制后台保存在一天内写入一次。请提供任何优化建议。 max-ziplist配置目前是默认配置。

memory optimization hash redis set
2个回答
2
投票

优化哈希

首先,让我们来看看哈希。两个重要的问题 - 每个哈希中有多少个元素,这些哈希值中的最大值是多少?如果满足以下条件,则哈希使用内存高效的ziplist表示:

len(hash) < hash-max-ziplist-entries && length-of-largest-field(hash) < hash-max-ziplist-value

您应该根据数据增加redis.conf中的两个设置,但不要将其增加超过默认值的3-4倍。

优化集

除非您提供有关用例的其他详细信息,否则无法优化具有100000的集合。一些一般策略 -

  1. 也许使用HyperLogLog - 您是否使用该集来计算唯一元素?如果你运行的唯一命令是saddscard - 也许你应该切换到hyperloglog。
  2. 也许使用Bloom Filter - 您是否使用该集来检查成员是否存在?如果您运行的唯一命令是saddsismember - 也许您应该实现布隆过滤器并使用它而不是集合。
  3. 每个元素有多大? - 集合成员应该很小。如果你要存储大对象,你可能做错了。

优化列表

  1. 单个列表275000似乎是错误的。访问列表中心的元素会很慢。您确定列出的是您的用例的正确数据结构吗?
  2. list-compress-depth更改为1或更高。在redis.conf中了解此设置 - 有权衡。但是对于275000个元素的列表,您当然希望启用压缩。

工具

使用开源redis-rdb-tools分析您的数据集。它会告诉你每个键占用多少内存。它将帮助您决定在哪里集中精力。

你也可以参考这个memory optimization cheat sheet

还有什么?

您提供的用例非常少。最好的节省来自为您的用例选择正确的数据结构。我建议您更新您的问题,详细了解您在散列/列表/集中存储的内容。


0
投票

我们进行了以下配置,这有助于将内存占用减少40%

list-max-ziplist-entries 2048
list-max-ziplist-value 10000

list-compress-depth 1

set-max-intset-entries 2048

hash-max-ziplist-entries 2048
hash-max-ziplist-value 10000

此外,我们增加了Linux服务器上的RAM,这有助于我们解决Redis内存问题。

© www.soinside.com 2019 - 2024. All rights reserved.