【Redis / 缓存内核】TTL 与过期:expires dict · 惰性/主动删除 · lazyfree

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

本文讨论了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不为每个键建立定时器等。

🏷️

标签

➡️

继续阅读