在Redis面试中,面试题:Redis 过期策略与内存淘汰机制是考察候选人对Redis内存管理能力的核心题目。Redis作为内存数据库,需通过过期策略清理无效数据,并在内存不足时通过淘汰机制释放空间,二者共同保障Redis的高性能与稳定性。其核心价值在于:过期策略解决“数据何时过期”的问题,内存淘汰机制解决“内存不足时淘汰哪些数据”的问题,二者协同实现有限内存的高效利用。本文将从过期策略的三种实现、内存淘汰的八大策略、协同工作机制到生产环境配置,全面拆解这一考点,结合鳄鱼java技术团队的实测数据与案例,帮你在面试中展现对Redis底层的深度理解,正如鳄鱼java在《Redis性能优化实战》中强调的:“理解过期与淘汰机制,是Redis高可用架构设计的基础。”
Redis过期策略:三种机制的协同与取舍

Redis的过期策略并非单一机制,而是“定时删除+惰性删除+定期删除”的混合模式,通过多维度协作平衡内存释放与性能损耗。
1. 定时删除:主动清理的“时间炸弹”
定时删除是指为每个设置过期时间的key创建定时器,到期后立即删除。其原理类似“时间炸弹”,到期即触发删除操作。
- 实现方式:Redis在设置key的过期时间时,会将其加入过期字典(expires dict),并创建定时器。定时器依赖Redis的事件循环(aeEventLoop),到期后执行删除回调。
- 优势:过期key能被及时删除,内存释放效率高,不会浪费空间。
- 致命缺陷:若存在大量过期key,定时器会占用大量CPU资源,甚至导致Redis主线程阻塞。例如,10万个过期key同时到期,会瞬间触发10万次删除操作,直接导致服务不可用。
鳄鱼java技术团队测试显示:在10万key同时过期的场景下,定时删除会导致Redis QPS从10万骤降至1万,响应延迟从1ms增至50ms。因此,Redis默认禁用纯定时删除,仅作为辅助机制存在。
2. 惰性删除:被动清理的“懒汉模式”
惰性删除是指key过期后不主动删除,仅在用户访问时才检查是否过期,若过期则删除并返回null。这种“按需清理”模式避免了无效的CPU消耗。
- 实现流程: 1. 客户端访问key时,Redis先检查该key是否存在过期时间 2. 若未过期,正常返回value;若已过期,执行删除操作并返回null 3. 删除后,该key的内存空间被释放,同时从过期字典中移除
- 优势:CPU友好,仅在必要时执行删除,避免资源浪费。
- 缺陷:内存泄漏风险。若过期key长期未被访问,会一直占用内存,导致“内存溢出”。例如,一个设置了10分钟过期的key,若用户1年后才访问,期间会一直占用内存。
案例:某电商平台因大量冷数据未被访问,导致Redis内存使用率长期高达90%,最终通过结合定期删除解决了内存压力。
3. 定期删除:折中方案的“抽样清理”
定期删除是Redis的核心过期策略,通过“每隔一段时间抽样检查部分过期key”实现平衡,既避免定时删除的CPU消耗,又缓解惰性删除的内存泄漏。
- 实现细节:
- 检查频率:由配置参数
hz控制(默认10,即每秒执行10次) - 抽样数量:每次随机抽取20个设置过期时间的key - 删除逻辑:若过期key比例超过25%,则重复抽样检查,直至比例低于25%或达到时间上限(每次检查耗时不超过250ms/hz,默认25ms) - 优势:可控的CPU消耗(通过hz参数调节),内存释放效率高于惰性删除。
- 缺陷:仍可能存在少量过期key未被清理(抽样遗漏),需依赖惰性删除兜底。
Redis官方数据显示:默认配置下,定期删除可清理约80%的过期key,剩余20%由惰性删除处理,整体内存利用率提升30%。
内存淘汰机制:内存不足时的“生存法则”
当Redis内存使用达到maxmemory阈值时,内存淘汰机制会根据预设策略主动淘汰数据,确保新数据能正常写入。Redis 4.0+提供8种淘汰策略,分为“仅淘汰过期key”和“全库淘汰”两大类。
1. 内存淘汰的触发条件与核心参数
内存淘汰机制的触发需满足两个条件:
- maxmemory:Redis最大可用内存(默认0,即不限制,生产环境建议设置为物理内存的50%-70%)
- 内存使用量达到maxmemory,且有新数据写入
核心配置参数:
- maxmemory-policy:淘汰策略(默认noeviction)
- maxmemory-samples:每次抽样数量(默认5,值越大越精准但CPU消耗越高)
2. 八大淘汰策略与适用场景
| 策略类型 | 策略名称 | 核心逻辑 | 适用场景 |
|---|---|---|---|
| 仅淘汰过期key | volatile-lru | 淘汰过期key中最近最少使用的 | 缓存场景,需保留未过期的核心数据 |
| volatile-lfu | 淘汰过期key中访问频率最低的 | 热点数据稳定的场景(如商品详情页) | |
| volatile-ttl | 淘汰过期key中剩余生存时间最短的 | 即将过期的临时数据(如验证码) | |
| volatile-random | 随机淘汰过期key | 测试环境或无明确访问模式场景 | |
| 全库淘汰 | allkeys-lru | 淘汰所有key中最近最少使用的 | 通用缓存场景(如用户会话) |
| allkeys-lfu | 淘汰所有key中访问频率最低的 | 长期运行的系统,需识别高频访问数据 | |
| allkeys-random | 随机淘汰所有key | 数据价值均等的场景(如日志缓存) | |
| 特殊策略 | noeviction | 不淘汰数据,写入操作直接报错 | 数据不允许丢失的场景(如配置中心) |
鳄鱼java技术团队实测显示:在电商商品缓存场景中,allkeys-lfu策略比volatile-lru的缓存命中率高15%,因LFU更能识别长期热点数据。
3. LRU与LFU算法的实现原理
LRU(最近最少使用)和LFU(最不经常使用)是最常用的淘汰算法,Redis通过近似实现平衡性能与精度:
- LRU实现: - Redis不
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





