Redis 提供了 8 种内存淘汰策略,用于在内存不足时自动删除数据,以腾出空间容纳新数据。这些策略分为 4 类:LRU(最近最少使用)、LFU(最不经常使用)、Random(随机) 和 TTL(生存时间)。以下是详细分类及每种策略的说明:
一、内存淘汰策略分类
1. 无淘汰策略(No Eviction)
- 策略名:
noeviction
- 核心逻辑:
- 内存不足时,直接拒绝所有写操作(如
SET
、HSET
等),但允许读操作。 - 默认策略,适用于数据必须绝对保留的场景(如配置中心)。
- 内存不足时,直接拒绝所有写操作(如
- 适用场景:
- 数据不能丢失(如关键业务数据、系统配置)。
2. LRU 系列(基于最近最少使用)
- 策略名:
allkeys-lru
:从所有键中淘汰最近最少使用的键。volatile-lru
:从设置了过期时间的键中淘汰最近最少使用的键。
- 核心逻辑:
- 通过维护一个候选池(默认大小为 16),每次随机采样
maxmemory-samples
个键(默认 5),选择最近最少使用的键淘汰。 - 近似 LRU:Redis 并未严格维护双向链表,而是通过采样优化性能与内存消耗的平衡。
- 通过维护一个候选池(默认大小为 16),每次随机采样
- 适用场景:
allkeys-lru
:通用缓存(如商品详情、用户信息)。volatile-lru
:临时缓存(如会话 Token、活动促销数据)。
3. LFU 系列(基于最不经常使用)
- 策略名:
allkeys-lfu
:从所有键中淘汰使用频率最低的键。volatile-lfu
:从设置了过期时间的键中淘汰使用频率最低的键。
- 核心逻辑:
- 使用 Morris 计数器 和 衰减机制(
lfu-decay-time
)模拟访问频率,避免早期访问的键长期占据优势。 - 更适合识别长期热点数据(如高频访问的用户画像)。
- 使用 Morris 计数器 和 衰减机制(
- 适用场景:
allkeys-lfu
:长期稳定缓存(如用户画像、统计信息)。volatile-lfu
:短期高频缓存(如活动页面点击量)。
4. Random 系列(随机淘汰)
- 策略名:
allkeys-random
:从所有键中随机淘汰键。volatile-random
:从设置了过期时间的键中随机淘汰键。
- 核心逻辑:
- 完全随机选择键进行删除,不考虑访问模式或频率。
- 适用场景:
- 无明确访问模式的数据(如日志缓存、测试环境数据)。
5. TTL 系列(基于生存时间)
- 策略名:
volatile-ttl
- 核心逻辑:
- 优先淘汰剩余生存时间(TTL)最短的键(即即将过期的键)。
- 适用场景:
- 需要自然淘汰的临时数据(如缓存的临时文件、短时任务状态)。
二、策略速览表
策略名 | 淘汰范围 | 核心逻辑 | 适用场景 |
---|---|---|---|
noeviction | 无淘汰 | 拒绝写操作 | 数据绝对不能丢失(如配置中心) |
allkeys-lru | 所有键 | 全局 LRU 淘汰 | 通用缓存(如商品详情) |
volatile-lru | 仅带过期时间的键 | 过期键中 LRU 淘汰 | 临时缓存(如会话 Token) |
allkeys-lfu | 所有键 | 全局 LFU 淘汰(访问频率最低) | 长期稳定缓存(如用户画像) |
volatile-lfu | 仅带过期时间的键 | 过期键中 LFU 淘汰(访问频率最低) | 短期高频缓存(如活动数据) |
allkeys-random | 所有键 | 随机淘汰 | 无明确访问模式的数据(如日志) |
volatile-random | 仅带过期时间的键 | 过期键中随机淘汰 | 测试环境/无特殊要求的临时数据 |
volatile-ttl | 仅带过期时间的键 | 淘汰剩余 TTL 最短的键 | 即将失效的临时数据(如日志缓存) |
三、选择策略的关键考量
- 数据重要性:
- 若数据必须保留(如订单状态),选择
noeviction
。 - 若数据可丢弃(如缓存),选择 LRU/LFU/TTL。
- 若数据必须保留(如订单状态),选择
- 访问模式:
- 有明显热点数据 → 选择
allkeys-lfu
或volatile-lfu
。 - 访问均匀 → 选择
allkeys-random
或volatile-random
。
- 有明显热点数据 → 选择
- 生命周期:
- 数据有明确过期时间 → 选择
volatile-*
系列(如volatile-ttl
)。 - 数据需长期保留 → 选择
allkeys-*
系列(如allkeys-lru
)。
- 数据有明确过期时间 → 选择
- 性能与精度平衡:
- LRU/LFU 的近似实现通过
maxmemory-samples
调整精度(默认 5)。
- LRU/LFU 的近似实现通过
四、配置方法
- 动态配置(无需重启):
CONFIG SET maxmemory-policy <策略名>
例如:CONFIG SET maxmemory-policy allkeys-lru
- 静态配置(修改
redis.conf
):maxmemory-policy allkeys-lru
五、典型场景推荐
场景特征 | 推荐策略 | 理由 |
---|---|---|
数据重要性相同 | allkeys-lru | 有效利用内存,保留热点数据 |
有明显热点数据 | allkeys-lfu | 保护长期高频访问的键 |
数据访问均匀 | allkeys-random | 公平淘汰,避免偏向性 |
混合持久数据与临时数据 | volatile-lru | 保护持久数据,清理过期键 |
临时缓存数据 | volatile-ttl | 自然淘汰即将过期的键 |
数据不可丢失 | noeviction | 确保数据安全,拒绝写入 |
六、注意事项
- 内存监控:定期使用
INFO memory
命令监控内存使用情况。 - 策略调整:根据业务需求动态调整策略(如高峰期切换为
volatile-ttl
)。 - 集群限制:在 Redis Cluster 中,脚本涉及的键必须位于同一 Slot(通过
{}
标签控制)。
通过合理选择内存淘汰策略,可以显著提升 Redis 的性能与稳定性,同时避免因内存不足导致的服务中断。
THE END