Redis过期策略与内存淘汰机制面试笔记
Redis过期策略
Redis采用惰性删除和定期删除相结合的策略来处理过期键。
惰性删除(Lazy Expiration)
当访问某个键时才检查是否过期,如果过期则删除并返回空值。
优点:CPU友好,只在访问时检查,避免无效检查
缺点:内存不友好,过期但未访问的键会一直占用内存
定期删除(Active Expiration)
Redis定期扫描数据库,随机选择一定数量的键进行过期检查并删除。
执行模式:
- SLOW模式:定时任务,默认10Hz频率,每次最多25ms
- FAST模式:频率不固定,间隔不低于2ms,每次不超过1ms
优点:通过限制执行时长和频率平衡CPU开销,有效释放过期键内存
缺点:难以确定最优的执行时长和频率
内存淘汰策略
当Redis内存不足时,会根据配置的淘汰策略删除数据为新数据腾出空间。
淘汰策略分类
针对所有键:
allkeys-lru
:基于LRU算法淘汰最近最少使用的键allkeys-lfu
:基于LFU算法淘汰最少使用频率的键allkeys-random
:随机淘汰键
针对设置TTL的键:
volatile-lru
:对有TTL的键使用LRU算法淘汰volatile-lfu
:对有TTL的键使用LFU算法淘汰volatile-ttl
:优先淘汰TTL值较小的键volatile-random
:随机淘汰有TTL的键
不淘汰:
noeviction
:不淘汰任何键,内存满时拒绝写入(默认策略)
算法补充
LRU(Least Recently Used):淘汰最近最少使用的数据,适合时间局部性强的场景
LFU(Least Frequently Used):淘汰使用频率最低的数据,适合访问模式相对固定的场景
常见面试问题及答案
Q1:数据库有1000万数据,Redis只能缓存20万数据,如何保证Redis中都是热点数据?
答案:使用allkeys-lru
淘汰策略。该策略会淘汰最近最少使用的键,保留经常访问的热点数据,确保缓存的有效性。
Q2:Redis内存用完了会发生什么?
答案:取决于配置的淘汰策略:
- 如果是默认的
noeviction
策略,会直接返回错误,拒绝写入操作 - 如果配置了其他淘汰策略,会按照相应规则删除数据后允许写入
Q3:如何选择合适的淘汰策略?
答案:
- 对于缓存场景,推荐
allkeys-lru
,确保热点数据留存 - 如果业务明确区分了临时数据和永久数据,可选择
volatile-lru
- 对于访问模式稳定的场景,可考虑
allkeys-lfu
- 生产环境避免使用
noeviction
,除非有特殊需求
总结
Redis的过期和淘汰机制是其内存管理的核心特性。过期策略确保及时清理过期数据,淘汰策略在内存不足时保证服务可用性。理解这些机制有助于合理配置Redis参数,优化缓存性能。