news 2026/4/15 19:41:25

Redis 常见的面试专题:缓存击穿、缓存雪崩、缓存穿透、什么是布隆过滤器、什么是延时双删、持久化的方式、Redis 分布式锁、I/O 多路复用等等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis 常见的面试专题:缓存击穿、缓存雪崩、缓存穿透、什么是布隆过滤器、什么是延时双删、持久化的方式、Redis 分布式锁、I/O 多路复用等等

Redis 常见的面试专题确实非常高频,几乎每家大厂/中大型公司后端/架构岗面试都会深挖。下面我把你列的这些点(缓存击穿、缓存雪崩、缓存穿透、布隆过滤器、延时双删、持久化方式、Redis 分布式锁、I/O 多路复用)全部覆盖,结合2025–2026年的主流实践和面试话术,给出定义 + 成因 + 危害 + 解决方案 + 代码示例 + 面试加分点的完整梳理。

1. 缓存穿透(Cache Penetration)

定义:查询一个根本不存在的数据,缓存和数据库都没有命中,导致请求每次都打到数据库。

成因:恶意攻击(大量不存在的key)、业务代码bug(参数校验缺失)、爬虫。

危害:数据库瞬间压力暴增,甚至宕机。

解决方案(主流优先级排序):

  1. 缓存空对象(最常用,简单有效)

    • 查询不到时缓存 “null” 或空字符串,设置短过期时间(30s~5min)
    • 优点:实现简单
    • 缺点:占用内存(可用短TTL缓解)、可能污染缓存
  2. 布隆过滤器(高并发、大数据量首选)

    • 在缓存前加一层布隆过滤器,先判断key“一定不存在”就直接返回
    • 优点:内存占用极小(1亿条数据约几十MB)、查询O(1)
    • 缺点:有误判(假阳性)、不支持删除(Redis原生布隆支持有限,可用布谷鸟过滤器)
  3. 接口层参数校验 + 限流

面试话术

“我一般优先用缓存空对象 + 短TTL,简单可靠;如果QPS很高且key空间很大,再引入Redis布隆过滤器(bloom filter module 或 redisson的R bloom filter),误判率控制在1%以内。”

2. 缓存击穿(Cache Breakdown / Hot Key失效)

定义:某个热点key突然失效,大量并发同时请求,瞬间全部打到数据库。

成因:热点数据刚好过期 + 高并发访问。

危害:数据库短时压力激增。

解决方案(主流三种):

  1. 互斥锁(分布式锁最常见)

    • 缓存miss → 获取分布式锁 → 只有一个线程去查DB → 回写缓存 → 释放锁
    • 其他线程自旋或sleep后重试
  2. 逻辑过期 / 永不过期 + 异步刷新

    • key不设TTL,value里带一个逻辑过期时间
    • 发现过期 → 异步线程去刷新 → 当前请求返回旧数据
  3. 热点key预加载 / Redis热点key自动发现 + 永不过期

代码示例(Redisson分布式锁):

Stringkey="hot:item:"+itemId;RLocklock=redisson.getLock("lock:"+key);Stringvalue=redisTemplate.opsForValue().get(key);if(value==null){try{if(lock.tryLock(10,TimeUnit.SECONDS)){// 尝试获取锁value=redisTemplate.opsForValue().get(key);// 双重检查if(value==null){value=db.queryItem(itemId);// 查库redisTemplate.opsForValue().set(key,value,30,TimeUnit.MINUTES);}}}finally{lock.unlock();}}returnvalue;

面试加分:提到“Redisson看门狗机制自动续期,避免业务执行时间长导致锁提前释放”。

3. 缓存雪崩(Cache Avalanche)

定义:同一时间大量key同时失效(或Redis宕机),导致海量请求瞬间打到数据库。

成因:统一设置了相同的过期时间、Redis全挂。

危害:数据库直接崩。

解决方案(多层防御):

  1. 过期时间加随机值(最基础)

    • expire = 基础时间 + Random(0~300)秒,错开失效
  2. 多级缓存(本地 + Redis + 数据库)

  3. 限流 / 熔断 / 降级(Hystrix、Sentinel、Resilience4j)

  4. Redis高可用(主从 + 哨兵 / Cluster)

  5. 热点数据永不过期 + 定时任务刷新

面试话术

“我项目里用的是随机过期 + Sentinel + 熔断降级三保险;极端情况下本地缓存兜底。”

4. 布隆过滤器(Bloom Filter)

定义:一种空间高效的概率型数据结构,用于判断一个元素是否可能存在于集合中。

核心思想:多个哈希函数 → 映射到bit数组的不同位 → 全1才可能存在。

优点:极省内存、查询O(k)(k为哈希函数个数)
缺点:有假阳性(一定不存在→一定不存在;可能存在→大概率存在)、不支持删除(原生)

Redis中的实现

  • Redis 6+ 自带BF.ADDBF.EXISTS(ReBloom模块)
  • Redisson 也有 RBloomFilter

面试常问:误判率怎么算?(约 (1 - e(-n*k/m))k ,m=bit位数,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 7+:Multi-part AOF(分片AOF),rewrite更高效。

面试话术

“生产我基本用混合持久化: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/kqueue
  • Redis 6+:多线程I/O(网络读写多线程,主逻辑仍单线程)

为什么快

  1. 内存操作(非磁盘)
  2. I/O多路复用(单线程处理成千上万连接)
  3. 高效SDS、ziplist、跳表、哈希表等数据结构
  4. 渐进式rehash、无锁(单线程)

面试话术

“Redis单线程模型避免了线程切换和锁竞争开销,结合epoll/kqueue实现了真正的非阻塞I/O,所以QPS能轻松上10w+。”

总结 & 面试应对建议

  • 三大缓存问题:穿透(布隆/空值)、击穿(分布式锁/逻辑过期)、雪崩(随机过期+限流熔断)
  • 一致性:延时双删(折中)、Canal+MQ(最终一致)、分布式锁(强一致)
  • 高可用:持久化选混合、分布式锁用Redisson、I/O多路复用是性能基石

你最想深入哪个点?
A. Redisson分布式锁源码级剖析(看门狗 + 可重入 + 续期)
B. 布隆过滤器误判率计算 + Redis实现代码
C. 真实生产案例:如何处理线上缓存雪崩/击穿事故
D. Redis 7+ 新特性对这些问题的影响(Multi-part AOF、函数等)
E. 三大问题完整Java + Spring Boot + Redisson实现Demo

告诉我字母,我继续展开!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/4 9:04:59

什么是google算法?搞懂底层逻辑才不会被收割

做外贸或者是搞独立站的朋友,大概都有过这种经历:前一天网站流量还在蹭蹭涨,第二天早上起来一开后台,心都凉了半截。数据断崖式下跌,询盘直接归零。这时候你跑去问SEO专家,对方通常会一脸深沉地告诉你&…

作者头像 李华
网站建设 2026/3/25 5:44:30

Claude统治一切!吞下这颗红药丸,焊工也是顶尖程序员

一种被称为「Claude-pilled」的诡异现象正在硅谷病毒式蔓延!焊工、律师、全职奶爸都在用Claude Code写APP,程序员的护城河正在以肉眼可见的速度崩塌。更恐怖的是,工程师们发现自己正在悄悄「退化」。搅翻整个硅谷的Anthropic,这次…

作者头像 李华
网站建设 2026/4/15 15:13:09

agent开发——深入解读短期记忆、长期记忆

在agent开发中短期记忆、长期记忆、对话历史也算是耳熟能详的概念了,一开始我一直很迷惑,经过一些时间的实践和探索,得出了一些结论,今天就用十分凝练易懂的方式让你5分钟贯通。 什么是短期记忆、长期记忆、对话历史?…

作者头像 李华