面试官:谈谈 Redis 的过期策略?

在线 Java 面试刷题(持续更新):https://www.quanxiaoha.com/java-interview

面试考察点

面试官提出这个问题,通常意在考察以下几个层面:

  1. 对缓存数据生命周期管理的理解:你是否清楚 Redis 作为缓存或数据库,需要有自动清理过期数据的能力。

  2. 对 Redis 核心机制的掌握深度:不仅仅是知道策略名称,更想知道你对其底层实现原理、协同工作方式的了解程度。

  3. 对系统资源与性能权衡的认知:如何设计过期策略才能在内存利用率、CPU 消耗、数据一致性之间取得平衡。

  4. 理论联系实际的能力:能否将策略与内存淘汰策略结合,并在实际开发中(如缓存穿透、雪崩)正确应用。

核心答案

Redis 的过期策略主要包含两个核心机制:惰性删除定期删除。它们是 Redis 用来清理过期 Key、回收内存的主要手段。此外,当这些策略无法及时释放足够内存时,会触发内存淘汰策略作为最后防线。

简单概括:

  • 惰性删除:访问 Key 时才检查并删除。

  • 定期删除:周期性抽样检查并删除。

  • 内存淘汰策略:内存不足时,按规则淘汰 Key(包括未过期的)。

深度解析

原理/机制

  1. 惰性删除 (Lazy Expiration)

  • 原理:当客户端尝试访问一个 Key 时,Redis 会先检查该 Key 是否设置了过期时间以及是否已过期。如果过期,则立即删除该 Key,并向客户端返回nil。这是一种被动、延迟的清理方式。

  • 优点:对 CPU 友好,只有在必须时才进行删除操作,不会在无关的 Key 上消耗计算资源。

  • 缺点:对内存不友好。如果一个过期 Key 永远不再被访问,它将永远占用内存,造成内存泄漏。惰性删除是保证 Redis 性能的第一道屏障。

  • 定期删除 (Periodic Expiration)

    原理:为了弥补惰性删除的缺陷,Redis 会周期性地(默认每秒 10 次,即每 100ms)主动执行一次过期 Key 清理。这个过程是自适应的:

      • 每次从设置了过期时间的 Key 字典中,随机抽取一定数量(默认 20 个)的 Key。

      • 检查并删除其中已过期的 Key。

      • 如果本轮抽查中,过期 Key 的比例超过 25%,则重复执行抽查删除过程,直到过期 Key 比例降至 25% 以下,或者本次定期删除耗时过长(防止阻塞主线程)。

    • 优点:通过限制执行时间和频率,减少了对主线程的阻塞,同时一定程度上减少了“永远不访问的过期 Key”造成的内存浪费。

    • 缺点:它仍然是一种抽样妥协的方案。难以完全精确地删除所有过期 Key,在 Key 数量巨大时,仍可能有部分过期 Key 残留。

  • 内存淘汰策略 (Eviction Policies)

    定位:这是过期策略的补充和兜底机制。当 Redis 内存使用达到maxmemory配置的阈值,且新写入数据时,如果惰性和定期删除没能及时释放空间,就会触发内存淘汰。

    8 种策略(Redis 7.x):

    • noeviction(默认):拒绝新写入,报错。适用于确需保留全部数据的场景。

    • allkeys-lru/volatile-lru:使用 LRU(最近最少使用)算法淘汰 Key。前者针对所有 Key,后者只针对设置了过期时间的 Key。

    • allkeys-lfu/volatile-lfu:使用 LFU(最不经常使用)算法淘汰 Key。LFU 比 LRU 更能精准识别热点数据。

    • allkeys-random/volatile-random:随机淘汰 Key。

    • volatile-ttl:优先淘汰过期时间更短(TTL 更小)的 Key。

    注意volatile-xxx策略只在设置了过期时间的 Key 中淘汰,但如果这部分内存不足以满足新需求,依然会触发noeviction类似的行为(报错)。生产环境常用allkeys-lruallkeys-lfu

    协同工作原理

    这两种删除策略与内存淘汰策略共同构成了 Redis 的内存管理闭环:

    // 伪代码逻辑示意 public Object get(String key) { // 1. 惰性删除:访问时检查 if (key.expired) { deleteKey(key); returnnull; } return data; } public void periodicTask() { // 2. 定期删除:后台循环任务 do { sampledKeys = randomSample(expiredKeyDict, 20); deletedCount = deleteExpiredKeys(sampledKeys); } while (deletedCount / 20.0 > 0.25 && timeLimitNotExceeded()); } public boolean writeData(String key, Object value) { // 3. 写入前检查内存,触发淘汰策略 if (usedMemory >= maxMemory) { if (!executeEvictionPolicy()) { // 执行配置的淘汰策略(如LRU) if (policy == “noeviction”) { thrownew RedisOOMError(); // 内存不足错误 } } } // ... 执行写入 }
    1. 每次读取操作都伴随一次惰性删除检查。

    2. 定期任务每秒运行多次,抽样清理,防止内存无限增长。

    3. 当内存触顶,写入操作会触发配置的淘汰策略,移除一些 Key(可能是过期的,也可能是未过期的)来腾出空间。

    最佳实践与常见误区

    • 最佳实践

    1. 根据业务形态选择淘汰策略:例如,缓存系统优先使用allkeys-lru;需要保留热点长期数据、只缓存临时数据的场景,可使用volatile-lru

    2. 合理设置过期时间:避免大量 Key 在同一时间点过期,防止定期删除压力陡增和缓存雪崩。可以添加随机偏移值,例如:expire = base_time + random(0, 300)

    3. 监控expired_keys指标:通过info stats命令查看,了解过期 Key 的清理速度是否正常。

  • 常见误区

    1. 误区一:“设置了过期时间,Key 到点就会立即被删除。” —— 错。删除依赖于惰性访问或定期扫描,存在延迟。

    2. 误区二:“volatile-lru只淘汰过期的 Key。” —— 错。它只从设置了过期时间的 Key 池子里淘汰,但淘汰的依据是 LRU 算法,被淘汰的 Key 在淘汰那一刻可能并没过期。

    3. 误区三:“内存淘汰策略可以替代过期策略。” —— 错。过期策略是主动管理生命周期,淘汰策略是内存不足时的应急措施。二者目的不同,需配合使用。

    总结

    Redis 通过惰性删除定期删除组合拳来管理 Key 过期,在 CPU 和内存效率之间取得了平衡,并以可配置的内存淘汰策略作为内存不足时的最终保障;理解这套机制对于设计高性能、高可用的缓存架构至关重要。

    👉 欢迎加入小哈的星球,你将获得:专属的项目实战(多个项目) / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论

    • 新项目:《Spring AI 项目实战》正在更新中..., 基于 Spring AI + Spring Boot 3.x + JDK 21;

    • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/

    • 《从零手撸:前后端分离博客项目(全栈开发)》2期已完结,演示链接:http://116.62.199.48/;

    • 专栏阅读地址:https://www.quanxiaoha.com/column

    截止目前,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中..后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有4200+小伙伴加入

    1. 我的私密学习小圈子,从0到1手撸企业实战项目~ 2. SpringBoot 集成 Hera,让日志查看从 “找罪证” 变 “查答案”! 3. 面试官:什么是 Redis 大 Key 问题,如何解决? 4. 蚂蚁又开源了一个顶级 Java 项目!
    最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
    PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀,谢谢啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1168003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

载入史册的哈军工计算机“集结号”

徐祖哲计算机六十年2026年1月15日 08:35 北京 中国计算机事业70年历程,在发展早期的重要节点留下了具有历史意义的多个集体合影:1955年8/9月,中科院物理所核科学家与计算机科学家合影;1958年8月1日,103电子计算机调试成…

2026黄金戒指怎么选?推荐这7款:款式多样,佩戴舒适!

"2026年黄金戒指怎么选?从材质、款式到舒适度,精选7大品牌推荐。足金999保值又时尚,活口设计贴合手指,简约百搭或精致雕花,周六福是正品吗总有一款让你爱不释手。"话说回来,想在2026年挑个合适的…

你以为日期选择器很简单?我刚进团队就被它狠狠干了一周

我最近加入了一个新团队。那种“成熟到可怕”的 Design System 团队:Figma 命名规矩、代码语义清晰、会议都有议程——你甚至能在日历里看到“讨论结束时间”。 但我第一次见识到他们的“当下大麻烦”,不是在什么战情室,也不是在发布事故复盘…

美防长访问“星舰基地”透露哪些信息

学习“马斯克模式”,加速AI军事化,美防长访问“星舰基地”透露多重信息环球网【环球时报特约记者 晨阳 环球时报记者 刘扬】美国总统特朗普近日提议将2027年美国国防开支提高到创纪录的1.5万亿美元,同时要求阻止国防承包商派息及进行股票回购…

几个硬件与人机环境系统智能的问题

问题1.国外一些投资机构在投资AI硬件产品时,会从A硬件的本质出发﹣-AI硬件应该是对人类感知和行为的无缝增强,成为我们身体和认知的自然部分,在使用时"消失",在需要时"显现"&#xff0c…

吐血推荐10个AI论文写作软件,专科生搞定毕业论文+格式规范!

吐血推荐10个AI论文写作软件,专科生搞定毕业论文格式规范! AI工具正在改变论文写作的未来 随着人工智能技术的不断进步,越来越多的学生开始借助AI工具来完成毕业论文的撰写。对于专科生而言,论文写作不仅是一项学术任务&#xff0…

浪潮信息和Datawhale成功举办「AI+X」高校人才培养研讨会!

Datawhale高校 线下:AIX高校人才培养研讨会1月8日,“AIX高校人才培养研讨会”在南京举办。面对人工智能全面融入传统学科的现实挑战,来自东南大学、南京大学、中国矿业大学、江南大学、浪潮信息、Datawhale开源学习社区等多所高校教育专家、行…

机器人学习!(二)ROS-模型优化与加速(TensorRT)(4)2026/01/15

TensorRT只适用NVIDIA:TensorRT是NVIDIA开发的闭源SDK,其核心优化技术深度依赖于NVIDIA GPU的专属硬件架构(如Tensor Core、SM单元)和软件生态(如CUDA、cuDNN)。替换方案:硬件平台推荐技术栈关键…

Spring Boot 钩子全集实战(六):SpringApplicationRunListener.contextPrepared()详解

Spring Boot 钩子全集实战(六):SpringApplicationRunListener.contextPrepared() 详解 在上一篇中,我们深入剖析了 ApplicationContextInitializer 这一容器初始化前的核心扩展点,实现了容器安全加固、Bean 定义预处理…

技术日报|Claude Code超级能力登顶,今日狂揽2000+星标

🌟 TrendForge 每日精选 - 发现最具潜力的开源项目 📊 今日共收录 10 个热门项目,涵盖 50 种编程语言🌐 智能中文翻译版 - 项目描述已自动翻译,便于理解🏆 今日最热项目 Top 10 🥇 obra/superpo…

RyTuneX(Win10/11系统优化工具)

RyTuneX是一款专为Windows 10和Windows 11系统打造的系统优化工具,基于WinUI 3框架构建,旨在帮助用户优化系统资源,提升设备性能,同时增强隐私保护。 软件功能 系统优化:支持一键性能调整,可禁用Superfetc…

HoRain云--掌握jQuery事件处理全攻略

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

普洛斯集团任命赵明琪为普洛斯中国首席执行官

、美通社消息:普洛斯集团(GLP Pte Ltd)宣布任命赵明琪为普洛斯中国首席执行官。赵明琪将向全球首席执行官梅志明汇报,她领导的中国管理团队都有深厚行业积累,以保证业务的连续性,并共同推动未来的成功。普洛斯中国前常务副董事长诸…

从脚本到服务:5 分钟通过 Botasaurus 将你的爬虫逻辑转化为 Web API

很多开发者对爬虫的认知还停留在“写一个 .py 脚本,跑完出个 CSV”的阶段。但在真实的业务场景中,爬虫往往需要作为微服务存在:通过 HTTP 调用、支持异步任务队列、拥有可视化监控后台。通常,这意味着你需要额外配置 FastAPI/Flas…

vue基于Python软件整合网站 flask django Pycharm

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 …

HoRain云--jQuery淡入淡出特效全解析

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

OTG最小改动!

如果要增加一个升级系统app,系统代码里有源代码直接改吗?就是最小改动的办法。OTA/Fota升级。 U盘刷机,工程测试程序好像有一个U盘更新OTA,但是需要插入U盘,我们设备是一个电源口,就是USB口,无法直接插USB读取文件的。那么这个需求要怎么加,最小改动? 如果要增加一个升…

HoRain云--JavaScript Switch语句详解与最佳实践

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…

vue基于Python 最美夕阳红老人服务站网站 flask django Pycharm

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 …

HoRain云--JavaScript while循环:从入门到精通

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…