回答
Redis 的 key 是可以设置过期时间的,但是 key 过期后,内存不一定会被立刻释放,主要是 Redis 采取了一种“延迟释放”的策略。针对这种策略, Redis 有两种方案:
- 惰性删除:当你尝试访问一个 Key 时,Redis 会首先检查这个 Key 是否过期,如果过期则返回 null 并删除它,如果没有过期则返回数据。
- 定期删除:Redis 每隔一段时间随机抽取一部分过期数据,然后删除这些过期数据。
详解
惰性删除
所谓惰性删除就是指客户端在访问这个 key 的时候,Redis 会对该 key 进行检查,如果过期则立刻删除同时返回 nil
,如果没有过期则返回数据。
采用这种策略,可以节约 CPU 成本,因为它不需要单独维护 TTL 表来处理过期 key 的删除。但是这种方式会存在内存泄露的风险。如果某些已过期的 key 一直都没有被访问的话,那么这些 key 就不会被删除了,他们占用的内存也就得不到释放了。
为了解决这个问题,Redis 提供还提供了定期删除来补充。
定期删除
Redis 每隔一段时间(默认100ms)会随机抽取 20 个过期 key,删除 20 个过期 key,如果过期的 key 比率超过 25%,则继续。
除了比例低于 25% 会退出外,还有一种情况会退出这个循环,单次删除任务超过 25ms,增加这个控制主要是为了保证过期扫描不会出现循环过度,导致线程卡死。
使用这种定期删除的方式可以避免一些过期 key 因长期未被访问而导致内存无法释放的问题。
我们思考一个问题,如果有大批量的 key 在同一时间过期,会导致什么问题?会导致定期删除操作很频繁,直到过期字典中的过期 key 比例低于 25%,这个过程会对 Redis 整体性能有一定的影响。
所以,在实际开发过程中,我们是需要分散我们的 key,采取的措施是在 key 的过期时间上面增加一个随机时间。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。