📘 《Java面试85题图解版(二)》进阶深化下篇:Redis缓存


📂 Java面试85题图解版 · 全系列7篇

基础核心篇 | 并发+JVM | Spring+数据库 | Redis缓存 ← 你在看| 高阶架构 | 高阶特性

📌 全系列总目录 | 💡 每道题 = 结构图 → 场景比喻 → 对比表 → 一句话总结


阅读提示:这是“图解+比喻+一句话总结”面试题库第二篇的进阶深化下篇,专注于Redis缓存共8道高频面试题。每道题仍然是四层结构——结构图 → 场景比喻 → 关键对比表 → 一句话总结


五、Redis 缓存(第61-68题)

📌 第61题:Redis 为什么这么快

一图看清

纯内存操作 → 读写微秒级
单线程命令处理 → 无锁竞争和上下文切换
I/O多路复用(epoll) → 一个线程监听大量连接
高效数据结构 → SDS字符串、压缩列表、跳跃表等专门优化
巧妙编码 → 小数据用紧凑编码(intset, ziplist)

比喻记忆高速收费员

  • 纯内存:钱箱在手边,不需要去银行金库取。
  • 单线程:一个人算账,不用交接班,没有交接差错。
  • 多路复用:十几个车道对讲机,哪个有车处理哪个,不傻等。
  • 6.0后多线程I/O:雇学徒负责收钱找零(网络读写),收费员自己还是只算账(命令执行单线程)。

💡 一句话总结Redis快 = 内存+单线程无锁+多路复用+高效结构,四大功臣。


📌 第62题:Redis 五种基本数据类型

一图看清

String → 缓存单值、计数器、分布式锁值
Hash   → 存储对象属性(用户信息、购物车)
List   → 消息队列、最新列表(有序可重复)
Set    → 标签、共同好友、去重(无序唯一)
ZSet   → 排行榜、时间线(按分数排序,唯一)

比喻记忆超市商品管理

  • String:价格标签,一物一价,简单直接。
  • Hash:商品详情卡,一张纸记录名称、产地、重量、保质期。
  • List:收银排队,先进先出,可从头尾操作。
  • Set:抽奖箱,名字不重复,能做交集(同时参与两个活动的人)。
  • ZSet:销量排行榜,每个商品带销量分,自动按分数排名。

💡 一句话总结String单值,Hash装对象,List排队,Set去重,ZSet排榜。


📌 第63题:Redis 持久化 RDB vs AOF vs 混合

一图看清

RDB:定时全量快照,文件小恢复快,可能丢失间隔数据
AOF:每条写命令追加,数据安全但文件大恢复慢
混合持久化(4.0+):RDB全量快照 + AOF增量追加,兼顾两者

比喻记忆手机备份

  • RDB:每天凌晨3点拍一张全机快照。手机下午丢了,凌晨3点到丢前的数据全没了。
  • AOF:每做一个操作记日记。丢了照着日记重做,细到每一步,恢复慢但完整。
  • 混合:凌晨拍一张快照,凌晨后只记操作笔记。恢复时先还原快照,再补几笔——又快又全。

💡 一句话总结RDB快而不全,AOF全而不快,混合持久化鱼与熊掌兼得。


📌 第64题:Redis 过期删除 + 内存淘汰

一图看清

过期键删除策略:
  惰性删除 → 访问时才检查,过期则删除
  定期删除 → 每秒10次,随机抽取一批key检查

内存淘汰(达到maxmemory时触发):
  noeviction → 不淘汰,写入直接报错
  allkeys-lru → 所有key中淘汰最近最少使用的
  allkeys-lfu → 所有key中淘汰最不经常使用的
  volatile-lru / volatile-lfu → 仅设过期时间的key
  volatile-ttl → 淘汰最快过期的

比喻记忆冰箱管理

  • 惰性删除:你饿了才看冰箱,拿鸡蛋时发现臭了,顺手扔掉。
  • 定期删除:每周末随机翻几个角落,过期就扔。
  • 内存淘汰:冰箱满了,新菜放不下。可扔最久没吃的(LRU),扔吃得次数最少的(LFU),或扔最快过期的(TTL)。

💡 一句话总结惰性+定期清过期;内存满了按策略淘汰,常用allkeys-lru。


📌 第65题:缓存穿透、击穿、雪崩

一图看清

穿透:大量请求查不存在的数据 → 缓存无 + DB也无 → DB被打爆
击穿:单个热点key过期瞬间 → 大量请求直击DB
雪崩:大量key同时过期或Redis宕机 → 缓存大面积失效 → DB瞬间承压

比喻记忆水库防洪

  • 穿透:有人故意在水坝上钻孔(请求不存在的key),水流直冲底部泥土(DB)。建“非法钻孔登记本”(布隆过滤器)拦截,或给钻孔灌水泥(缓存空值)。
  • 击穿:某个热门水闸刚好放水,洪峰直冲下游。马上上锁只让一个工人检修(互斥锁),修好再开。
  • 雪崩:多个闸门同时意外全开。闸门开启时间随机打散(过期时间加随机值),建多个水库(高可用集群)。

💡 一句话总结穿透查“无”,击穿是“一”过热,雪崩是“大”批倒——布隆+锁+过期打散。


📌 第66题:Redis 分布式锁正确姿势

一图看清

加锁:SET key value NX PX 30000(原子操作:不存在则设,带30秒超时)
解锁:Lua脚本校验value一致后才DEL(防止误删别人的锁)

常见坑及方案:
  锁超时,业务没执行完 → Redisson看门狗自动续期
  误删别人的锁 → 唯一标识 + 原子校验后删除
  主从切换丢锁 → Redlock算法多实例加锁
  不可重入 → Redisson加计数器实现可重入

比喻记忆火车站自助寄存柜

  • 加锁:扫码开柜,系统给动态码,设30分钟自动清柜。
  • 看门狗:管理员每10分钟看你还在不在,在就帮你续期。
  • 误删:你输码取行李,系统先确认码是你的。不是你的码拒绝打开(Lua校验value)。
  • 主从丢锁:Redlock要求同时在多个独立柜子加锁,过半成功才算成功。

💡 一句话总结Redis锁=原子加+唯一凭证+原子解,生产直接上Redisson别自己造轮子。


📌 第67题:Redis 哨兵 vs 集群

一图看清

哨兵Sentinel:监控+自动故障转移,全量数据在主,单主瓶颈,垂直扩展
集群Cluster:去中心化,16384哈希槽分片,水平扩展,至少3主3从

比喻记忆物业 vs 城中村

  • 哨兵:一栋楼(主),监控摄像头(哨兵)盯着。楼倒了启用备楼(从提升为主)。扩容只能加楼层(垂直扩展),总有天花板。
  • 集群:村里多栋楼,每栋管部分住户(分片)。一栋倒了住户自动分配(槽迁移)。可不断建新楼(水平扩展)。

💡 一句话总结哨兵管主从切换高可用,集群管分片扩展,大流量必须集群。


📌 第68题:Redis 6.0 多线程模型

一图看清

6.0前:单线程全包(网络读取 + 命令解析 + 命令执行 + 网络写回)
6.0后:网络读写多线程(io-threads) + 命令执行仍单线程

比喻记忆面馆经营升级

  • 6.0前:老板一人接单、煮面、端面。多灶台(多核CPU)但老板只有一双手(单线程),接单时不能煮面。
  • 6.0后:雇两个学徒接单、传菜(多线程I/O)。老板只煮面(命令执行单线程)。面还是老板的味道(原子性不变),但接单传菜快多了。

💡 一句话总结6.0只让网络读写变多线程,命令执行仍是单线程,原子性不变。


本篇(下篇)是《Java面试85题图解版(二)》的最后一篇,我们完整覆盖了Redis从快到锁到集群的全部核心能力

至此,进阶深化篇的39道题已全部分享完毕。你已经掌握了:

  • 并发编程从锁升级到线程池的全链路
  • JVM从运行时数据区到OOM排查
  • Spring从IoC到事务失效的核心原理
  • MySQL与PostgreSQL的深层差异
  • Redis所有高频考点

这些恰好是面试官在中后段最常追问的内容——你把它们用画面和故事讲出来,面试官就知道你不是背的。


上一篇: 进阶深化(中):Spring核心 + 数据库进阶

下一篇: 高阶架构设计篇 —— 进入分布式深水区:CAP理论(异地恋比喻)、秒杀系统设计(抢票比喻)、分布式事务、Service Mesh、CQRS……大厂定级用的高价值题目。(即将发布)

💡 Redis的比喻帮你把五种类型、缓存三兄弟、分布式锁全串起来了。想深入Redis集群和性能优化?
姊妹系列《Java 100天进阶之路》进阶篇会覆盖Redis源码、哨兵集群实战、缓存最佳实践。
👉 《Java 100天进阶之路 · 完整目录导航》
👉 点击关注我 📂 返回全系列导航


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐