大家好,我是锋哥。今天分享关于【说说Redis的内存淘汰策略?】**面试题。**希望对大家有帮助;
说说Redis的内存淘汰策略?
Redis 的内存淘汰策略(Eviction Policy)是在内存达到上限(由 maxmemory 参数控制)时,用于决定哪些键需要被删除以释放空间的机制。理解这些策略对于优化性能和防止 OOM(Out of Memory)异常非常关键。
一、Redis 的内存淘汰触发条件
当:
used_memory > maxmemory
时,Redis 会触发内存淘汰机制。
如果没有配置 maxmemory(默认不限制),Redis 会一直增长直到操作系统层面内存不足。
二、Redis提供的内存淘汰策略
可通过命令:
CONFIG SET maxmemory-policy <policy_name>
来设置。
可选策略如下:
| 策略名称 | 描述 |
|---|---|
| noeviction | 默认策略。当内存不足时,写入命令(如 SET、LPUSH)直接报错,不会删除任何键。只读命令仍可执行。 |
| volatile-lru | 仅在设置了过期时间的键中,使用 LRU 算法淘汰最久未被访问的键。 |
| allkeys-random | 在所有键中随机删除。 |
| volatile-random | 仅在设置了过期时间的键中随机删除。 |
| volatile-ttl | 仅在设置了过期时间的键中,优先删除剩余生存时间(TTL)最短的键。 |
| allkeys-lfu | 在所有键中,使用 LFU(最少使用频率)算法淘汰最少访问的键。 |
| volatile-lfu | 仅在设置了过期时间的键中,使用 LFU 算法淘汰最少访问的键。 |
三、LRU 与 LFU 的区别
LRU(Least Recently Used)
- 根据"最近访问时间"判断冷热;
- 每次访问更新时间戳;
- Redis 采用近似 LRU算法,利用采样机制(默认采样5个键,取最旧的一个)提高性能。
LFU(Least Frequently Used)
-根据"访问次数"判断冷热;
- Redis4.0+ 引入;
- 内部用对数衰减计数器(counter + decay)实现;
- 适合访问模式稳定的业务场景。---
四、常见使用场景与推荐策略
| 场景 | 推荐策略 | 说明 |
|---|---|---|
| 缓存系统(典型使用场景) | allkeys-lru |
自动淘汰最久未访问的数据,保持热点数据。 |
| 临时数据存储,部分 key 有过期时间 | volatile-lru 或 volatile-ttl |
仅淘汰有过期时间的数据,保留永久数据。 |
| 数据分布均匀、访问随机 | allkeys-random |
简单高效,但命中率较低。 |
| 高频访问稳定场景 | allkeys-lfu |
通过访问频率判断热度,更智能。 |
| 禁止删除,数据必须保留 | noeviction |
保证数据安全,但可能导致写入失败。 |
五、相关配置参数
# 设置最大内存
CONFIG SET maxmemory 512mb
# 设置淘汰策略
CONFIG SET maxmemory-policyallkeys-lfu
# 设置LRU采样数(默认5)
CONFIG SET maxmemory-samples 10
maxmemory-samples 越大,淘汰策略越接近真实的 LRU/LFU,但性能开销也会增加。
六、总结
| 分类 | 策略 | 说明 |
|---|---|---|
| 不淘汰 | noeviction | 内存满时报错 |
| 随机淘汰 | allkeys-random / volatile-random | 随机删除键 |
| 基于访问频次 | allkeys-lru / volatile-lru / allkeys-lfu / volatile-lfu | 根据访问热度淘汰 |
