在查询我的 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 错误。请务必也重新考虑您的内存管理策略。
相关信息
Redis 4.0.10 参数更改
Redis 节点类型特定的参数
密钥驱逐 — Redis 密钥驱逐策略(LRU、LFU 等)概览