Memcached 过期与删除机制:Lazy Expiration 与 LRU 策略详解
Memcached 作为内存缓存系统,其过期数据处理和内存回收机制直接影响缓存有效性和资源利用率。与传统数据库的主动过期检查不同,Memcached 采用懒惰删除(Lazy Expiration) 和LRU(最近最少使用) 策略,以最小的性能开销实现内存管理。本文深入解析这两种机制的原理、优缺点及实际表现。
Lazy Expiration(延迟过期):不主动检查,按需验证
核心原理
Memcached 不会主动监控数据是否过期,而是在用户尝试获取数据时才检查其过期时间:
- 当客户端执行
get <key>时,Memcached 首先判断该键是否存在。 - 若存在,检查其时间戳是否过期(当前时间 > 过期时间)。
- 若已过期,返回 “键不存在”(
END),并将该键标记为无效,从curr_items统计中移除。 - 若未过期,返回数据,并更新其 “最近使用时间”(用于 LRU 策略)。
优点
- 节省 CPU 资源:无需维护定时器或线程监控所有键的过期状态,避免频繁检查带来的性能损耗。
- 简单高效:过期检查与数据访问绑定,仅在必要时执行,适合高并发场景。
缺点
- 内存占用延迟释放:过期数据可能长时间驻留内存(直到被访问或被 LRU 淘汰),导致短期内存利用率下降。
- 统计数据延迟更新:
stats命令中的curr_items会包含已过期但未被访问的键,直至其被主动获取或淘汰。
示例
存储一个 10 秒后过期的键:
