Redis 是一个内存数据库,它所有的数据都存放在内存中,因此**内存管理和淘汰策略(Eviction Policy)**对于 Redis 的稳定运行至关重要。下面将从 DBA 运维角度,结合配置参数和真实使用场景,系统介绍相关知识。
一、Redis 的内存管理机制
Redis 使用内存来存储:
-
所有 key 和 value 数据;
-
AOF 缓冲区(如果开启);
-
客户端连接对象;
-
Lua 脚本缓存;
-
复制缓冲区;
-
Pub/Sub 消息等。
默认情况下,Redis 不限制最大内存,直到系统内存耗尽,导致 OOM。
因此运维上必须通过配置 maxmemory 参数为 Redis 设置内存上限。
示例:
maxmemory 2gb
二、当内存达到上限会发生什么?
当达到 maxmemory 限制后:
-
若执行只读命令(如 GET),Redis 继续正常工作;
-
若执行写命令(如 SET、LPUSH、ZADD),Redis 会尝试通过**“数据淘汰”**来释放内存;
-
如果没有可淘汰数据或策略不允许淘汰,则返回错误(例如:OOM command not allowed when used memory > 'maxmemory')。
三、Redis 数据淘汰策略(maxmemory-policy)
配置参数:maxmemory-policy
用于定义当 Redis 内存达到上限时,如何淘汰数据。
可选策略如下(来自官方文档):
| 策略名 | 说明 | 场景 |
|---|---|---|
| noeviction | 默认策略,不淘汰数据,写命令报错 | 高安全性场景(例如缓存重要数据) |
| allkeys-lru | 从所有 key 中,淘汰最近最少使用的 key(LRU) | 通用缓存 |
| volatile-lru | 从设置了过期时间的 key 中淘汰 LRU | 配合缓存失效控制 |
| allkeys-random | 所有 key 中随机淘汰 | 少见,一般不用 |
| volatile-random | 设置了过期时间的 key 中随机淘汰 | 少见 |
| volatile-ttl | 淘汰即将过期的 key(TTL 值最小) | 适用于时间敏感缓存 |
| allkeys-lfu | 从所有 key 中淘汰使用频率最低的 key(LFU) | 更智能,推荐 Redis 4.0+ 使用 |
| volatile-lfu | 设置了过期时间的 key 中淘汰使用频率最低的 key | 智能+时间双重控制 |
Redis 4.0 引入 LFU 策略(Least Frequently Used),比 LRU 更精细。
示例配置:
maxmemory-policy allkeys-lru
四、如何观察 Redis 内存使用情况?
使用命令:
INFO memory
输出包含:
used_memory:10123456 # 实际使用内存(字节)
used_memory_human:9.65M # 人类可读
maxmemory:2147483648 # 配置的上限
mem_fragmentation_ratio:1.15 # 内存碎片率(>1.2 需关注)
分析淘汰情况:
INFO stats
观察:
evicted_keys:4567 # 被淘汰 key 的总数量(累计值)
keyspace_hits:...
keyspace_misses:...
五、LFU/LRU 实现原理简析(适合 DBA 理解)
LRU(Least Recently Used)
Redis 为每个 key 维护一个 LRU 时间戳,基于时间戳选择淘汰对象。并非精确 LRU,而是采样近似算法(省内存 + 高性能)。
LFU(Least Frequently Used)
Redis 为每个 key 维护一个 8-bit 使用频率计数器 counter(最多 255)。通过指数衰减算法定期降低频率,优先淘汰“很少使用”的 key。
配置:
maxmemory-policy allkeys-lfu
lfu-log-factor 10 # 控制频率计数器增长速率
lfu-decay-time 1 # 每分钟衰减一次频率
六、实际运维建议
推荐配置示例(缓存场景):
maxmemory 2gb
maxmemory-policy allkeys-lfu
数据安全场景:
maxmemory 0 # 不限制内存
appendonly yes # 开启 AOF
maxmemory-policy noeviction
辅助工具:
-
redis-cli中可用MEMORY USAGE keyname精确查看某 key 的内存占用; -
使用
MEMORY STATS查看 Redis 全局内存分布; -
使用
redis_exporter+Prometheus+Grafana 做内存监控与告警。
小结(DBA 必知重点)
| 项目 | 建议 |
|---|---|
| 是否开启内存上限 | 设置 maxmemory |
| 淘汰策略推荐 | allkeys-lfu 或 volatile-lfu |
| 内存监控 | INFO memory + evicted_keys |
| 大 key 排查 | MEMORY USAGE keyname |
| Redis 作为缓存使用时 | maxmemory + 淘汰策略必须配置 |
如需我为你生成一份适用于生产 Redis 的 redis.conf 片段(结合你机器内存情况),或者你想了解 Redis 如何定位大 key、慢 key,可以继续告诉我。也可以继续深入理解 Redis 的内存分配器 jemalloc 与性能优化方法。




