2026/4/17 20:36:44
网站建设
项目流程
陕西网站建设美化,线上渠道推广怎么做,国家企业信用信息,做网站平面模板是啥意思在线 Java 面试刷题#xff08;持续更新#xff09;#xff1a;https://www.quanxiaoha.com/java-interview面试考察点面试官提出这个问题#xff0c;通常意在考察以下几个层面#xff1a;对缓存数据生命周期管理的理解#xff1a;你是否清楚 Redis 作为缓存或数据库持续更新https://www.quanxiaoha.com/java-interview面试考察点面试官提出这个问题通常意在考察以下几个层面对缓存数据生命周期管理的理解你是否清楚 Redis 作为缓存或数据库需要有自动清理过期数据的能力。对 Redis 核心机制的掌握深度不仅仅是知道策略名称更想知道你对其底层实现原理、协同工作方式的了解程度。对系统资源与性能权衡的认知如何设计过期策略才能在内存利用率、CPU 消耗、数据一致性之间取得平衡。理论联系实际的能力能否将策略与内存淘汰策略结合并在实际开发中如缓存穿透、雪崩正确应用。核心答案Redis 的过期策略主要包含两个核心机制惰性删除和定期删除。它们是 Redis 用来清理过期 Key、回收内存的主要手段。此外当这些策略无法及时释放足够内存时会触发内存淘汰策略作为最后防线。简单概括惰性删除访问 Key 时才检查并删除。定期删除周期性抽样检查并删除。内存淘汰策略内存不足时按规则淘汰 Key包括未过期的。深度解析原理/机制惰性删除 (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.xnoeviction默认拒绝新写入报错。适用于确需保留全部数据的场景。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-lru或allkeys-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(); // 内存不足错误 } } } // ... 执行写入 }每次读取操作都伴随一次惰性删除检查。定期任务每秒运行多次抽样清理防止内存无限增长。当内存触顶写入操作会触发配置的淘汰策略移除一些 Key可能是过期的也可能是未过期的来腾出空间。最佳实践与常见误区最佳实践根据业务形态选择淘汰策略例如缓存系统优先使用allkeys-lru需要保留热点长期数据、只缓存临时数据的场景可使用volatile-lru。合理设置过期时间避免大量 Key 在同一时间点过期防止定期删除压力陡增和缓存雪崩。可以添加随机偏移值例如expire base_time random(0, 300)。监控expired_keys指标通过info stats命令查看了解过期 Key 的清理速度是否正常。常见误区误区一“设置了过期时间Key 到点就会立即被删除。” —— 错。删除依赖于惰性访问或定期扫描存在延迟。误区二“volatile-lru只淘汰过期的 Key。” —— 错。它只从设置了过期时间的 Key 池子里淘汰但淘汰的依据是 LRU 算法被淘汰的 Key 在淘汰那一刻可能并没过期。误区三“内存淘汰策略可以替代过期策略。” —— 错。过期策略是主动管理生命周期淘汰策略是内存不足时的应急措施。二者目的不同需配合使用。总结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因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦