2026/4/10 12:54:51
网站建设
项目流程
dw软件网站建设教程视频,wordpress设计幻灯片,做网站看网页效果,做网站百科Redis 常见的面试专题确实非常高频#xff0c;几乎每家大厂/中大型公司后端/架构岗面试都会深挖。下面我把你列的这些点#xff08;缓存击穿、缓存雪崩、缓存穿透、布隆过滤器、延时双删、持久化方式、Redis 分布式锁、I/O 多路复用#xff09;全部覆盖#xff0c;结合2025…Redis 常见的面试专题确实非常高频几乎每家大厂/中大型公司后端/架构岗面试都会深挖。下面我把你列的这些点缓存击穿、缓存雪崩、缓存穿透、布隆过滤器、延时双删、持久化方式、Redis 分布式锁、I/O 多路复用全部覆盖结合2025–2026年的主流实践和面试话术给出定义 成因 危害 解决方案 代码示例 面试加分点的完整梳理。1. 缓存穿透Cache Penetration定义查询一个根本不存在的数据缓存和数据库都没有命中导致请求每次都打到数据库。成因恶意攻击大量不存在的key、业务代码bug参数校验缺失、爬虫。危害数据库瞬间压力暴增甚至宕机。解决方案主流优先级排序缓存空对象最常用简单有效查询不到时缓存 “null” 或空字符串设置短过期时间30s~5min优点实现简单缺点占用内存可用短TTL缓解、可能污染缓存布隆过滤器高并发、大数据量首选在缓存前加一层布隆过滤器先判断key“一定不存在”就直接返回优点内存占用极小1亿条数据约几十MB、查询O(1)缺点有误判假阳性、不支持删除Redis原生布隆支持有限可用布谷鸟过滤器接口层参数校验 限流面试话术“我一般优先用缓存空对象 短TTL简单可靠如果QPS很高且key空间很大再引入Redis布隆过滤器bloom filter module 或 redisson的R bloom filter误判率控制在1%以内。”2. 缓存击穿Cache Breakdown / Hot Key失效定义某个热点key突然失效大量并发同时请求瞬间全部打到数据库。成因热点数据刚好过期 高并发访问。危害数据库短时压力激增。解决方案主流三种互斥锁分布式锁最常见缓存miss → 获取分布式锁 → 只有一个线程去查DB → 回写缓存 → 释放锁其他线程自旋或sleep后重试逻辑过期 / 永不过期 异步刷新key不设TTLvalue里带一个逻辑过期时间发现过期 → 异步线程去刷新 → 当前请求返回旧数据热点key预加载 / Redis热点key自动发现 永不过期代码示例Redisson分布式锁Stringkeyhot:item:itemId;RLocklockredisson.getLock(lock:key);StringvalueredisTemplate.opsForValue().get(key);if(valuenull){try{if(lock.tryLock(10,TimeUnit.SECONDS)){// 尝试获取锁valueredisTemplate.opsForValue().get(key);// 双重检查if(valuenull){valuedb.queryItem(itemId);// 查库redisTemplate.opsForValue().set(key,value,30,TimeUnit.MINUTES);}}}finally{lock.unlock();}}returnvalue;面试加分提到“Redisson看门狗机制自动续期避免业务执行时间长导致锁提前释放”。3. 缓存雪崩Cache Avalanche定义同一时间大量key同时失效或Redis宕机导致海量请求瞬间打到数据库。成因统一设置了相同的过期时间、Redis全挂。危害数据库直接崩。解决方案多层防御过期时间加随机值最基础expire 基础时间 Random(0~300)秒错开失效多级缓存本地 Redis 数据库限流 / 熔断 / 降级Hystrix、Sentinel、Resilience4jRedis高可用主从 哨兵 / Cluster热点数据永不过期 定时任务刷新面试话术“我项目里用的是随机过期 Sentinel 熔断降级三保险极端情况下本地缓存兜底。”4. 布隆过滤器Bloom Filter定义一种空间高效的概率型数据结构用于判断一个元素是否可能存在于集合中。核心思想多个哈希函数 → 映射到bit数组的不同位 → 全1才可能存在。优点极省内存、查询O(k)k为哈希函数个数缺点有假阳性一定不存在→一定不存在可能存在→大概率存在、不支持删除原生Redis中的实现Redis 6 自带BF.ADDBF.EXISTSReBloom模块Redisson 也有 RBloomFilter面试常问误判率怎么算约 (1 - e(-n*k/m))k mbit位数n元素数k哈希函数数5. 延时双删延迟双删策略定义更新数据库后先删缓存 → 延迟几百ms~几秒再删一次缓存。适用场景Cache Aside模式下写操作导致读-写不一致。为什么两次删第一次删更新DB前删防止旧数据被读延迟第二次删更新DB和删缓存之间有短暂时间差可能有并发读把旧数据又写回缓存 → 延迟再删一次代码示例典型实现// 更新商品publicvoidupdateItem(Itemitem){// 1. 先删缓存redisTemplate.delete(item:item.getId());// 2. 更新数据库itemMapper.update(item);// 3. 延迟双删异步或定时任务Thread.sleep(500);// 或用DelayQueue / MQ 延迟redisTemplate.delete(item:item.getId());}面试话术“延时双删是Cache Aside下比较折中的方案如果追求最终一致性可结合Canal MQ监听binlog异步删缓存强一致性场景用分布式锁 读写锁。”6. Redis 持久化方式方式机制优点缺点丢失数据窗口恢复速度生产推荐RDB定时快照fork子进程文件小、恢复快可能丢数据最后一次快照后快辅助AOF记录每条写命令数据最安全fsync策略文件大、恢复慢取决于fsync慢主用混合持久化AOF RDB preamble恢复快 安全Redis 4.0折中较快首选Redis 7Multi-part AOF分片AOFrewrite更高效。面试话术“生产我基本用混合持久化appendfsync everysec aof-use-rdb-preamble yes丢失最多1秒恢复速度比纯AOF快很多。”7. Redis 分布式锁实现方式对比方案实现命令优点缺点 / 风险推荐场景setnx expiresetnx expire简单非原子、过期后可能误删他人锁学习演示Lua脚本set px nx原子性业务执行时间 锁超时 → 误删中小型项目RedissonRedissonLock看门狗自动续期、可重入依赖Redisson依赖生产首选Redlock多节点多数派更高可用实现复杂、争议大时间同步、网络分区极高一致性需求Redisson看门狗默认每10s续期一次锁超时时间1/3线程存活就一直续。8. I/O 多路复用Redis为什么单线程还这么快核心Redis 6前基本单线程主线程处理命令靠I/O多路复用 内存操作 高效数据结构实现高性能。演进Redis 6前单线程 select/poll/epoll/kqueueRedis 6多线程I/O网络读写多线程主逻辑仍单线程为什么快内存操作非磁盘I/O多路复用单线程处理成千上万连接高效SDS、ziplist、跳表、哈希表等数据结构渐进式rehash、无锁单线程面试话术“Redis单线程模型避免了线程切换和锁竞争开销结合epoll/kqueue实现了真正的非阻塞I/O所以QPS能轻松上10w。”总结 面试应对建议三大缓存问题穿透布隆/空值、击穿分布式锁/逻辑过期、雪崩随机过期限流熔断一致性延时双删折中、CanalMQ最终一致、分布式锁强一致高可用持久化选混合、分布式锁用Redisson、I/O多路复用是性能基石你最想深入哪个点A. Redisson分布式锁源码级剖析看门狗 可重入 续期B. 布隆过滤器误判率计算 Redis实现代码C. 真实生产案例如何处理线上缓存雪崩/击穿事故D. Redis 7 新特性对这些问题的影响Multi-part AOF、函数等E. 三大问题完整Java Spring Boot Redisson实现Demo告诉我字母我继续展开