1. 为什么需要内存淘汰策略?
Redis 是一个基于内存的高性能数据库,所有数据都存储在内存中。
优点:读写速度极快。
缺点:内存有限,存满之后如果继续写入,就必须有一套策略来决定“删掉谁,留下谁”。
这就是 内存淘汰策略(Eviction Policy)。
配置参数:
maxmemory <bytes> # 限制 Redis 使用的最大内存
maxmemory-policy <policy> # 设置淘汰策略
2. Redis 内存淘汰策略分类
Redis 提供了 8 种内存淘汰策略(6 个淘汰策略 + 2 个特殊模式)。
(1)不淘汰
noeviction(默认)
当内存不足时,直接返回错误,不再接受写入请求(读请求正常)。
适合当 Redis 作为缓存以外的使用场景,比如严格控制数据不丢失。
(2)针对设置了过期时间(TTL)的 key
volatile-lru:在设置了过期时间的 key 中,淘汰最近最少使用的 key。
volatile-lfu:在设置了过期时间的 key 中,淘汰使用频率最低的 key。
volatile-ttl:在设置了过期时间的 key 中,优先淘汰 TTL(剩余生存时间)最短的 key。
volatile-random:在设置了过期时间的 key 中,随机淘汰一个 key。
(3)针对所有 key
allkeys-lru:在所有 key 中,淘汰最近最少使用的 key(常见策略)。
allkeys-lfu:在所有 key 中,淘汰使用频率最低的 key(更智能)。
allkeys-random:在所有 key 中,随机淘汰一个 key。
3. 各策略优缺点
策略 | 说明 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
noeviction | 默认,不淘汰,写操作报错 | 数据绝对安全 | 无法继续写入 | 严格控制数据不可丢失 |
volatile-lru | 在设置过期时间的 key 中淘汰最近最少使用 | 常用缓存策略 | 只作用于设置 TTL 的 key | 缓存系统,定期过期数据 |
allkeys-lru | 在所有 key 中淘汰最近最少使用 | 最常用,命中率高 | 可能误删重要数据 | 通用缓存 |
volatile-lfu | 在设置过期时间的 key 中淘汰使用频率最低 | 更智能的缓存淘汰 | 计算频率有额外开销 | 热点数据缓存 |
allkeys-lfu | 在所有 key 中淘汰使用频率最低 | 热点数据保留更久 | 实现复杂,性能略低 | 高频访问的缓存系统 |
volatile-ttl | 在设置过期时间的 key 中,优先淘汰 TTL 最短的 | 控制过期优先级 | 使用场景少 | 时间敏感型缓存 |
volatile-random | 在设置过期时间的 key 中随机淘汰 | 简单 | 命中率低 | 特殊场景 |
allkeys-random | 在所有 key 中随机淘汰 | 简单 | 命中率低 | 低优先级缓存 |
4. 实际推荐方案
allkeys-lru:最常用,适合做缓存,保证热点数据尽量保留。
allkeys-lfu:Redis 4.0+ 引入,更智能,适合热点数据集变化较快的场景。
volatile-ttl:适合有明显过期优先级的业务,例如“临期数据优先清理”。
5. 总结
Redis 内存满时需要根据策略来淘汰数据。
LRU(Least Recently Used) → 淘汰最近最少用的数据。
LFU(Least Frequently Used) → 淘汰使用次数最少的数据。
TTL → 优先淘汰即将过期的数据。
推荐 allkeys-lru 或 allkeys-lfu,适合大多数缓存场景。