Redis 内存满了怎么办?
更新时间:2026-09-18。问题驱动短答页。现象通常是写入报
OOM command not allowed when used memory > 'maxmemory',或used_memory持续逼近上限。
一句话回答
先 INFO memory 确认 used_memory 与 maxmemory、看是否触发淘汰,再用 --bigkeys/MEMORY USAGE 定位是 BigKey 还是大量未设过期的键占满内存;应急可临时调大 maxmemory/删大键止血,根治要配正确的淘汰策略、给键设 TTL、拆分大键、必要时集群扩容。
第一步:看内存现状
redis-cli INFO memory | grep -Ei 'used_memory_human|maxmemory_human|mem_fragmentation'
redis-cli CONFIG GET maxmemory-policy
redis-cli --bigkeys # 扫描各类型最大的 key(从节点/低峰执行)
redis-cli MEMORY USAGE some_key # 单个 key 占多少字节used_memory:数据实际占用;maxmemory:上限。mem_fragmentation_ratio:>1.5 说明碎片多,可在低峰ACTIVEREFRAG或重启整理。
第二步:分清是什么占满的
| 原因 | 特征 | 处理 |
|---|---|---|
| BigKey | 单个 hash/list/set 几十万成员、大 string | 拆分(分桶/hash 分段)、UNLINK 异步删,详见 BigKey 治理 |
| 键没设过期 | 业务缓存永久驻留,只增不减 | 补 TTL;按前缀扫描清理 |
| 淘汰策略不对 | 配了 noeviction/volatile-* 但键都没 TTL | 改 allkeys-lru(纯缓存) |
| 碎片率高 | used_memory_rss 远大于 used_memory | 开启主动碎片整理/低峰重启 |
| 容量真不够 | 键都合理但总量到顶 | 纵向加内存或 Cluster 水平扩容 |
第三步:选对淘汰策略(最容易配错)
| 策略 | 行为 | 适用 |
|---|---|---|
noeviction | 内存满直接拒绝写(默认!) | Redis 当持久存储、不能丢数据 |
allkeys-lru | 所有键中淘汰最久未用 | 纯缓存,最常用 |
volatile-lru | 只在设了过期的键里 LRU | 缓存+持久数据混合 |
allkeys-lfu/volatile-lfu | 按访问频率淘汰(Redis4+) | 有明显热点、防偶发访问污染 |
volatile-ttl | 优先淘汰快过期的 | 有明确 TTL 分层 |
纯缓存场景务必设 maxmemory + allkeys-lru,否则默认 noeviction 会在满时直接让所有写入报错。
应急与根治
# 应急:临时放大上限(若机器还有内存)止血
redis-cli CONFIG SET maxmemory 8gb
# 删除超大键用 UNLINK 异步释放,避免 DEL 阻塞主线程
redis-cli UNLINK huge_key
# 长期:CONFIG SET 后记得写进配置文件
redis-cli CONFIG SET maxmemory-policy allkeys-lru根治:大键拆分(一个百万成员的 set 按 hash 槽拆成多个)、缓存键统一 TTL 并加随机抖动防雪崩、热点/大键纳入监控;单机到顶就上 Redis Cluster 槽位与水平扩缩。
坑
- 只删大键却不管碎片:
DEL大键还会阻塞 Redis 造成卡顿,要用UNLINK/HSCAN渐进删。 - 在主节点高峰期跑
--bigkeys/KEYS *:会占用资源,应在从节点或用SCAN低峰执行。 - 设了
volatile-lru但缓存都没 TTL:等于没有可淘汰键,照样 OOM。 - 不设
maxmemory:Redis 会吃到机器物理内存触发 swap/OOM Killer,比受控淘汰更危险。
BigKey/HotKey 的定位拆分见 Redis BigKey/HotKey 治理;持久化对内存/fork 的影响见 Redis 持久化 RDB 与 AOF。
总结
Redis 内存满先 INFO memory 对比 used_memory 与 maxmemory、确认淘汰与碎片,再用 --bigkeys 和 MEMORY USAGE 判断是 BigKey、未设 TTL 的键、淘汰策略误配还是真容量不足;纯缓存必须设 maxmemory 配 allkeys-lru/lfu 并给键加带抖动的 TTL,持久存储才用 noeviction,大键拆分并用 UNLINK 异步删、碎片用主动整理,单机到顶走 Cluster 扩容;切忌不设上限裸奔、在主节点高峰跑 KEYS/--bigkeys,或配了 volatile-lru 却不给键设过期。