【Redis / 缓存内核】TTL 与过期:expires dict · 惰性/主动删除 · lazyfree
内容提要
本文讨论了Redis的键过期机制,强调TTL是到期时间戳而非定时器。Redis通过双表结构管理键和过期时间,结合惰性删除和主动过期释放内存。惰性删除在访问时触发,主动过期通过定期采样清理过期键。大对象删除使用lazyfree机制,避免主线程阻塞。总结了常见误解,并指出物理内存回收可能滞后于逻辑过期。
关键要点
-
TTL 不是定时器,而是到期时间戳,Redis 通过双表结构管理键和过期时间。
-
expires 表与 keys 表是平行结构,存储绝对毫秒时间戳,支持 O(1) 的过期判断。
-
惰性删除在访问时触发,过期键在未被访问时仍占用内存,物理回收可能滞后于逻辑过期。
-
主动过期通过 activeExpireCycle 定期采样清理过期键,采用自适应采样策略。
-
lazyfree 机制用于大对象的异步释放,避免主线程阻塞,提高性能。
-
常见误解包括 TTL 到期不意味着立即释放内存,Redis 不为每个键建立定时器,副本节点默认不删除过期键。
延伸解读
TTL的误解与实际情况
许多用户误以为TTL到期后,键会立即释放内存。实际上,过期键在未被访问时仍会占用内存,物理回收可能滞后于逻辑过期。这意味着在高并发场景下,过期键的存在可能会影响内存使用效率,运维人员需关注内存监控,确保及时清理。
惰性与主动删除的平衡
Redis采用惰性删除和主动过期相结合的策略,以提高性能。惰性删除在访问时触发,而主动过期则通过定期采样清理过期键。这种设计在高写入负载的情况下尤为重要,运维人员应根据实际使用情况调整active-expire-effort参数,以优化内存管理。
lazyfree机制的优势
lazyfree机制允许Redis在后台线程中异步释放大对象,避免主线程阻塞。这对于处理大规模数据时尤为重要,可以显著提高系统的响应速度。运维人员应关注lazyfree_pending_objects的数量,以评估系统的内存释放效率。
延伸问答
Redis中的TTL是什么?
TTL是到期时间戳,而不是定时器,Redis通过双表结构管理键和过期时间。
Redis如何处理过期键的删除?
Redis使用惰性删除和主动过期机制,惰性删除在访问时触发,主动过期通过定期采样清理过期键。
什么是lazyfree机制?
lazyfree机制用于大对象的异步释放,避免主线程阻塞,提高性能。
Redis的expires表和keys表有什么区别?
expires表存储带TTL的键及其绝对毫秒时间戳,而keys表存储主数据,二者为平行结构。
Redis的主动过期机制是如何工作的?
主动过期通过activeExpireCycle定期采样清理过期键,采用自适应采样策略。
常见的关于Redis TTL的误解有哪些?
常见误解包括TTL到期不意味着立即释放内存,Redis不为每个键建立定时器等。