目录标题
当然可以,下面是如何通过 Redis 的 maxmemory-policy
设置不同淘汰策略,以在达到 maxmemory
限制时自动淘汰键值,避免触发 OOM 错误的完整说明。
一、背景:为什么 Redis 会触发 OOM 错误?
Redis 是一个内存数据库,默认行为是:
- 当内存达到
maxmemory
限制时, - 如果没有设置合适的淘汰策略,
- 并尝试执行写操作(如
SET
), - 就会抛出错误:
OOM command not allowed when used memory > 'maxmemory'.
为了避免这种情况,Redis 提供了多种内存淘汰策略,可以自动删除部分键值,释放空间。
二、如何设置 Redis 内存上限和淘汰策略
1. 设置最大可用内存
CONFIG SET maxmemory 100mb
也可以在 redis.conf
中配置:
maxmemory 100mb
2. 设置内存淘汰策略(maxmemory-policy)
CONFIG SET maxmemory-policy allkeys-lru
或者在 redis.conf
中:
maxmemory-policy allkeys-lru
三、Redis 支持的淘汰策略详解
策略 | 说明 | 是否适用于所有键 | 是否考虑键的使用频率 |
---|---|---|---|
noeviction(默认) | 不淘汰任何数据,超过内存直接报错(OOM) | ❌ | ❌ |
volatile-lru | 从设置了过期时间(TTL)的键中,按最近最少使用(LRU)策略淘汰 | ✅(部分) | ✅ |
allkeys-lru | 从所有键中按最近最少使用(LRU)策略淘汰 | ✅ | ✅ |
volatile-random | 从设置了 TTL 的键中随机淘汰 | ✅(部分) | ❌ |
allkeys-random | 从所有键中随机淘汰 | ✅ | ❌ |
volatile-ttl | 从设置了 TTL 的键中淘汰“剩余生存时间最短”的 | ✅(部分) | ❌(只看 TTL) |
✅ 表示策略支持该行为,❌ 表示不支持
四、策略使用建议
场景 | 建议策略 | 说明 |
---|---|---|
有大量缓存类数据,允许丢失 | allkeys-lru | 常用于缓存型 Redis,淘汰最近最少使用的数据 |
只想淘汰设置了 TTL 的键 | volatile-lru | 数据区分是否持久,TTL键淘汰更安全 |
数据一致性要求低 | allkeys-random | 更快,性能开销小,不追踪访问频率 |
想避免任何数据被自动淘汰 | noeviction | 容错风险大,慎用,需额外监控 |
五、示例验证(使用 redis-cli)
127.0.0.1:6379> CONFIG SET maxmemory 10mb
OK
127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
OK
接着用 Python 或 redis-benchmark 写入大量数据,看是否 Redis 自动开始清除旧数据,而不是报 OOM。
六、配合 maxmemory-samples 提高 LRU 精度(可选)
CONFIG SET maxmemory-samples 5
- 默认是 5,表示 Redis 每次挑选 5 个键计算哪个最少使用。
- 增大这个值(如 10 或 20)可以提高 LRU 淘汰精度,但增加 CPU 开销。
七、总结
-
maxmemory-policy
是 Redis 控制内存使用的核心配置,推荐总是与maxmemory
一起使用。 -
合理的淘汰策略可以极大提升 Redis 的容错性与稳定性,避免 OOM 错误导致服务中断。
-
一般推荐:
- 缓存型应用:
allkeys-lru
- 临时数据缓存:
volatile-lru
- 性能优先、数据可丢失:
allkeys-random
- 缓存型应用:
是否需要我补一段通过配置文件 redis.conf
在容器或生产环境中持久化这些设置的方法?