如何解决 Amazon ElastiCache Redis 集群节点的错误消息“当所用内存 > 'maxmemory' 时不允许 OOM 命令”?

上次更新时间:2020 年 6 月 8 日

在查询我的 Amazon ElastiCache for Redis 集群节点时,客户端收到错误:“当所用内存 > 'maxmemory' 时不允许 OOM 命令”。这个错误意味着什么,我该怎样解决呢?

简短描述

ElastiCache for Redis 集群无法释放任何额外内存时,发生 OOM 错误。

内存不足时,ElastiCache for Redis 会实施为缓存节点的参数组设置的 maxmemory-policy。默认值 (volatile-lru) 会移出设置了过期时间的键(TTL 值),从而释放内存。缓存节点没有包含 TTL 值的任何键时,则会返回错误。

要解决此错误并防止客户端收到不允许 OOM 命令错误消息,请执行以下一些组合操作:

  • 为节点上的键设置 TTL 值。
  • 更新参数组以使用不同的 maxmemory-policy 参数。
  • 手动删除一些现有键以释放内存。
  • 选择较大的节点类型。

注意:这些解决方法的实际组合取决于您的具体使用案例。

解决方法

为节点上的键设置 TTL 值

您可以为节点上的键设置 TTL 值。然后,默认 volatile-lru 内存管理策略会移出过期键以释放内存。

如果您设置了 TTL 值,还可以使用 volatile-ttl 设置。此设置通过仅移出具有过期设置的键(从 TTL 最短的键开始)即可腾出空间。

选择其他 maxmemory-policy 设置

将缓存节点参数组的 maxmemory-policy 设置为以下其中一个值:

  • allkeys-lru:通过先移出最近较少使用的键来腾出空间。
  • allkeys-random:通过移出随机键来腾出空间。
  • volatile-random:通过移出具有过期设置的随机键来腾出空间。

此外,Redis 4.0 提供最不常用的 (LFU) 移出模式:

  • allkeys-lfu:通过移出访问次数最少的键来腾出空间。
  • volatile-lfu:通过移出具有过期设置的键(从访问次数最少的键开始)来腾出空间。

删除现有键以释放内存

您可以使用 DEL 命令删除现有键来释放内存。有关更多信息,请参阅 redis.io 网站上的 Del key [key...]

重要提示:删除现有键只是临时解决 OOM 错误。请务必也重新考虑您的内存管理策略。

选择较大的节点类型

每个节点类型都有不同的可用内存量。您不能修改节点上的可用内存量。但您可以使用具有更多存储空间的较大节点类型。

重要提示:使用较大的节点类型只是临时解决 OOM 错误。请务必也重新考虑您的内存管理策略。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?