《Java面试85题图解版(二)》进阶深化下篇:Redis缓存
📘 《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所有高频考点
这些恰好是面试官在中后段最常追问的内容——你把它们用画面和故事讲出来,面试官就知道你不是背的。
下一篇: 高阶架构设计篇 —— 进入分布式深水区:CAP理论(异地恋比喻)、秒杀系统设计(抢票比喻)、分布式事务、Service Mesh、CQRS……大厂定级用的高价值题目。(即将发布)
💡 Redis的比喻帮你把五种类型、缓存三兄弟、分布式锁全串起来了。想深入Redis集群和性能优化?
姊妹系列《Java 100天进阶之路》进阶篇会覆盖Redis源码、哨兵集群实战、缓存最佳实践。
👉 《Java 100天进阶之路 · 完整目录导航》
👉 点击关注我 📂 返回全系列导航
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)