Redis作为当今最流行的内存数据库,其高性能的核心在于内存管理。但当内存耗尽时,Redis如何决定淘汰哪些数据?不同的淘汰策略如何影响你的应用性能?如何根据业务场景选择最佳策略?
本文将带你彻底掌握Redis内存淘汰机制,涵盖:
✅ 6种淘汰策略的底层原理
✅ 实战场景下的最优选择
✅ 性能调优技巧与避坑指南
✅ 高频面试题解析(助力拿下大厂Offer)
(文末附赠「Redis内存优化检查清单」)
假设你的Redis实例内存上限为8GB,当数据量达到8GB时,新的写入请求会怎样?
OOM errors
)Redis提供6种淘汰策略,分为两类:
noeviction
(默认):内存满时拒绝所有写入请求(DEL
和读请求正常)。
volatile-ttl
:优先淘汰过期时间最短的键。
noeviction
!allkeys-random
:从所有键中随机淘汰。
volatile-random
:仅从设置了TTL的键中随机淘汰。allkeys-lru
(推荐):淘汰最近最少使用的键(基于近似LRU算法)。
maxmemory-samples
调整采样精度(默认5,增大则更精确但耗CPU)。volatile-lru
:仅淘汰设置了TTL的键中LRU的键。allkeys-lfu
(Redis 4.0+):淘汰使用频率最低的键(基于LFU算法)。
volatile-lfu
:仅淘汰设置了TTL的键中LFU的键。业务场景 | 推荐策略 | 理由 |
---|---|---|
缓存穿透防护 | allkeys-lru |
保留高频访问键,避免击穿 |
会话(Session)存储 | volatile-ttl |
会话天然有过期时间 |
实时排行榜 | allkeys-lfu |
高频更新的热点数据长期保留 |
冷备数据存储 | noeviction |
数据不可丢失,需人工干预 |
监控淘汰效率:
redis-cli info stats | grep evicted_keys
evicted_keys
持续增长,需扩容或优化策略。混合使用TTL+LRU:
allkeys-lru
实现分级淘汰。避免“内存抖动”:
maxmemory-policy allkeys-lru
时,确保maxmemory
留出10%缓冲空间。LRU和LFU的本质区别是什么?
为什么Redis使用近似LRU而非真实LRU?
如何模拟OOM测试淘汰策略?
redis-cli --bigkeys # 找出大Key
redis-cli config set maxmemory 1GB # 强制触发淘汰
noeviction
(除非必要)used_memory
和evicted_keys
SCAN
替代KEYS
避免阻塞行动号召:
立即检查你的Redis配置:
redis-cli config get maxmemory-policy
如果还是默认的noeviction
,今晚可能会失眠哦!
点赞收藏,下一篇揭秘《Redis持久化AOF与RDB的终极对决》!