【搞定面试官】系列:缓存雪崩、缓存击穿、缓存穿透

分布式开发核心考点全解析:事务、锁与缓存一致性 在分布式系统设计中,事务一致性、锁机制和缓存策略是构建高可用服务的基石。从CAP与BASE理论出发,理解分布式环境下ACID失效的根源,才能掌握2PC、TCC、Saga等分布式事务方案的适用边界。Redis分布式锁的正确实现、缓存穿透/击穿/雪崩的应对策略,以及Seata AT模式的无侵入回滚原理,都是工程实践中的高频技术点。此外,数据分片、一致性哈希、雪花算法和分布式任务调度,共同构成了分布式开发者的完整知识体系。本文结合顺丰科技秋招客观题,系统梳理这些核心概念与实战陷阱,帮助开发者从原理层面构建分布式系 阅读详情

前言

Redis在当今电商环境中炙手可热,但是使用Redis除了能大幅提高性能之外,也会带来很多问题。最常见的有:缓存雪崩、缓存击穿、缓存穿透。本篇将重点介绍这三个问题及解决方案。
关于Redis面试基础可以看该系列的第一篇:
【阿里面试中的Redis】系列:Redis基础

正文:面试开始

小伙子,我看你简历上写到了Redis,那么你了解过什么是缓存雪崩吗?
缓存雪崩是指同一时间Redis中的key大面积失效,一瞬间缓存好像没有一样,所有的请求都打到的数据库。这个时候如果是瞬时高并发大流量的话,对于数据库而言可是灾难性的。并且如果系统没有做熔断降级的话,基本上就是瞬间挂一片的节奏。但是缓存雪崩常见于哪些场景呢?

这里我就举个例子:比如在秒杀系统,经常在活动开始前会有数据预热,什么意思呢,就是提前把相关的SKU和库存信息塞进缓存,一般入缓存的数据会设置一个过期时间,假如此时把这些SKU的过期时间设置一样。假设秒杀开始的时候瞬时来了5000个请求,而这些key同时都失效了,本来单机Redis扛住5000QPS毫无压力,这下缓存崩了,所有请求直接打到了MySQL,数据库必然扛不住,也许它会“嗷呜”一声报个警,但是还没等到DBA听到响就直接挂了。并且无论你怎么重启数据库,只要Redis没热点数据,MySQL立马又会被新的流量打得爬不起来。

在这里插入图片描述


拓展:
这里少侠用Jmeter对单机数据库进行了压测,设置的参数如下图所示,参数说明:

  • Number of Threads(users):线程数或者请求的用户数。这里设置了2000个并发。
  • Ramp-up period(seconds):请求的间隔时间。这里设置为0,表示同时请求。
  • Loop Count:每个线程循环请求次数。
    在这里插入图片描述


当热点数据全部可以从Redis中获取时候,压测结果如下,参数说明:

  • Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户循环10次,那么这里显示100。
  • Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间。
  • Median:中位数,也就是 50% 用户的响应时间。
  • X% Line:X% 用户的响应时间。
  • Min:最小响应时间。
  • Max:最大响应时间。
  • Error%:本次测试中出现错误的请求的数量/请求的总数。

Throughput:吞吐量,即默认情况下表示每秒完成的请求数(Request per Second)。
注意看下图,99%的请求响应是7ms,MySQL的吞吐量是265.4/s,响应正常。

在这里插入图片描述


当Redis发生缓存雪崩时,注意看下图,99% 请求的响应都到了5136ms了,吞吐量也下降了一半以上。

在这里插入图片描述


好的,那再说说你在开发中是如何解决缓存雪崩的?
这个一般是三种方式:一是设置过期时间时为每个key的失效时间都加个随机值,保证它们不会在统一时间失效;二是在集群Redis环境下,将这些热点数据分布到不同的Redis库中也能规避同时全部失效的风险;第三种就比较简单粗暴了,根本就不设置过期时间,只有当MySQL数据更新时同步更新缓存就好了。
那你了解缓存击穿和缓存穿透么,可以说说它们跟缓存雪崩的关系吗?
缓存击穿跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了数据库,而缓存击穿不同的是缓存击穿是指一个key非常热点,在不停的扛着高并发,高并发流量集中对这一个key进行访问,当这个Key在失效的瞬间,持续的大并发就击穿缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
缓存穿透是指缓存和数据库中都没有的数据。可能是用户恶意请求,也有可能是用户访问了过期被物理删除的数据。这里举个简单的例子,MySQL自增主键一般都是从1开始的,如果用户查询了id=-1的数据,正常缓存和数据库中都是没有的,如果这种请求量又很大的话,数据库保不准就挂了。
那说说这两种问题分别如何解决?
缓存击穿的解决方案主要有两种,一是设置热点key永不过期。二是利用互斥锁,每次只能有一个用户获取到key,如果key失效了,会从MySQL中查询并更新到Redis,此时最多也就一次请求MySQL。
缓存穿透就比较讲究了,缓存穿透主要可能是黑客或者行业竞争对手的恶意攻击,尤其对于对外API接口,比如分页参数如果不做校验,调用方二话不说,先请求它一个亿!再来几个并发调用,如果这是在618期间,会发生什么就不言而喻了。所以我们首先可以做的就是接口里关键参数必须加校验,把这些请求拦截在代码层。事实上在开发中我们要有一颗“不信任”的心态,因为你不知道调用你接口的人是谁。第二种方式就是大名鼎鼎的布隆过滤器了,原理也很简单,就是利用高效的数据结构和算法快速判断出你这个key是否在数据库中存在,不存在你return就好了,存在你就去查MySQL刷新到Redis并将结果集return。

小结

Redis是现在的NoSQL的代表,熟练运用和掌握其原理对个人的成长大有裨益。

本例相关代码如下,仅供参考(如需完整源码请留言):

/**
 * @author Carson
 * @date 20-8-20 下午5:00
 */
@RestController
public class CommonController {
    private final Logger logger = LoggerFactory.getLogger(CommonController.class);
    @Autowired
    private JdbcTemplate template;
    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping(value = "/showValue", method = RequestMethod.GET)
    public String showName(@RequestParam("key") Integer key) {
        // query from cache
        ValueOperations valueOperations = redisTemplate.opsForValue();
        String val = (String) valueOperations.get(key);
        if (StringUtils.isBlank(val)) {
            logger.warn("缓存雪崩!!!");
            // query from mysql
            String sql = "SELECT user_name FROM cps_user_info WHERE id=?";
            val = template.queryForObject(
                    sql, new Object[]{key}, String.class);
            if (StringUtils.isNotBlank(val)) {
                valueOperations.set(key, val, 6000L, TimeUnit.SECONDS);
            }
        }
        return "Value:" + val;
    }

    @RequestMapping(value = "/insertRedis", method = RequestMethod.GET)
    public void insertRedis() {
        Integer key = 1;
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set(key, "SEU", 10L, TimeUnit.SECONDS);
    }
}
分页进阶-使用redis实现基础分页缓存(一)使用aop代理 本项目采用基础ssm配置来实现,首先我们使用redis来做缓存,那么我们就需要先在spring中整合redis。做缓存的对象都是查询操作,从这一点我们可以想到使用spring的aop来对对应的查询操作进行拦截处理,步骤如下。到这里我们就实现了使用aop和redis来实现分页缓存。有关redis的配置。 阅读详情

相关推荐

SpringBoot+MybatisPlus+Redis,涉及分页、缓存等

代码主要涉及SpringBoot框架搭建,以及MP分页和Redis缓存使用,内容详解可见博主的博客,如有疑问或建议,可以博文留言或加Q群:583138104交流讨论

【案例实战】SpringBoot整合Redis实现缓存分页数据查询

SpringBoot整合Redis实现缓存分页数据查询

互联网小阿祥 9763

如何在Redis中实现分页排序查询过程解析

主要介绍了如何在Redis中实现分页排序查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Redis缓存分页

Redis 缓存分页封装

weixin_38923162的博客 2796

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

在当今科技飞速发展的时代,人工智能(AI)已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域,AI的应用更是无处不在。今天,我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执行检索增强生成(Retrieval-Augmented Generation,简称RAG),并且被认为是目前最优秀的RAG框架之一。本文将详细探讨RAGflow的创新功能、技术特点以及如何在实际应用中发挥其最大潜力。

Yooao的博客 9618

C#报表,使用微软rdlc模板,生成Excel, PDF, Word, Image文件,使用自定义对象做数据集不连接数据库

我项目是用vs2017 建的,.NET farmwork 4.7.2 这种报表可以用于任何模式的应用,web,桌面,因为这只是生成一个文件或者文件流 步骤比较详细啰嗦,其中有讲到rdlc怎么新建设计,如果已经会设计rdlc了的可以直接跳到底部看代码的执行结果, 底部还有源码下载链接,百度盘 首先控制台安装报表包 新建rdlc 报表 建立rdlc里要用的数据模型 模型建完,或者修改都要重新...

qq_35955916的博客 5203

【redis缓存分页思路】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

taiouren的博客 3633

GD32F303串口DMA发送数据避坑指南:为什么你的发送函数会卡住?

本文深入解析GD32F303单片机串口DMA发送数据时常见的卡死问题,提供详细的避坑指南。从DMA传输完成中断时序、发送状态管理到双通道DMA的特别注意事项,全面剖析问题根源并给出解决方案,帮助开发者构建健壮的DMA发送机制。

weixin_27038245的博客 295

redis中运用到缓存和分页操作

作业:// 学生表 id sname cid//班级表 cid cname缓存注解一般是在service层查询所有的班级 以及班级中的所有的信息 并能缓存 到rdis里面(不要求分页)Stream流 获取第二页的数据 ( 每页数据有2条)MySQL的部分项目依赖:pom文件。

A0415_1119的博客 410

「转载」vaptcha 等手势验证码图像识别与轨迹提取(思路)

作者:文安哲 从博客重开以后就说要更文章,鸽了蛮久了,赶紧补上一篇嫖嫖各位老公的流量。 最近看群里面大家讨论研究手势验证码比较多,然后我也顺带研究做了一下,给各位老公们分享一下做的过程。 首先,一起来康康手势验证码长啥样! 大概就是长这个样子,需要按照图像中的那条轨迹再图片上滑动,不得不说这类验证码确实体验感拉满,让人很想立马关掉这个网站。 那么言归正传,这类验证码该怎么做识...

AI悦创·编程私教1v1 3597

Python爬虫实战:百度贴吧帖子与评论抓取全攻略(附舆情分析技巧)

基础配置# 要爬取的贴吧名称(替换成自己需要的,比如“XX手游吧”)TIEBA_NAME = "XX手游"# 分页参数(每页50条帖子,可根据需求调整)PAGE_NUM = 3 # 爬取前3页帖子,共150条# 请求头(从浏览器复制自己的,更真实)Win64;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2387

大厂面试官喜欢这样问Redis,双写一致性、并发竞争、线程模型,我整理好了

你知道的越多,你不知道的越多 点赞再看,养成习惯 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下夸张的修辞手法),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写《吊...

敖丙 3万+

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

2024年最全Java实现栈四个方法,值得一读!_java 栈的方法,字节跳动高级java开发面试

1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

2401_84584375的博客 2251

基于simulink的多能源系统协同与能源互联网的电网系统场景实例:虚拟电厂(VPP)中电网与储能集群的协同控制

本文详细介绍了使用Simulink构建虚拟电厂(VPP)与储能集群协同控制系统的完整建模过程。主要内容包括:1) VPP系统架构设计;2)分步骤建模过程,涵盖虚拟电厂系统创建、储能单元与集群建模、VPP控制器设计(核心)以及协同控制场景仿真;3)性能分析与典型应用场景。通过混合整数线性规划优化调度和智能指令分解策略,实现了VPP参与电力市场交易、电网调频调峰等功能,验证了系统在提升可再生能源消纳率(96%)、降低电网峰谷差(35%)等方面的优异性能。该建模方法为能源互联网中的分布式资源聚合与协同控制提供了实

xiaoheshang_123的博客 471

PyQt5数据库开发3 6 QSqlQuery完整实操案例【图文详解】

PyQt5数据库开发3 6.1 QSqlQuery实操案例【多图详解】,本文有点长,主要每一个步骤都有对应的图文教程!!!

qq_53317005的博客 2963

阿里面试官:使用Redis有什么缺点?

Redis在国内各大公司都很热门,比如新浪、阿里、腾讯、百度、美团、小米等。Redis也是大厂面试最爱问的,尤其是Redis客户端、Redis高级功能、Redis持久化和开发运维常用问题...

程序员之家 1374

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

阿里面试官Redis把我问到哑口无言…

Redis在国内各大公司都很热门,比如新浪、阿里、腾讯、百度、美团、小米等。Redis也是大厂面试最爱问的,尤其是Redis客户端、Redis高级功能、Redis持久化和开发运维常用问题...

ITMuch的专栏 2065

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《吊打面试官》系列-秒杀系统设计

正文首先设计一个系统之前,我们需要先确认我们的业务场景是怎么样子的,我就带着大家一起假设一个场景好吧。场景 我们现在要卖100件下面这个婴儿纸尿裤,然后我们根据以往这样秒杀活动的数据经验...

WantFlyDaCheng的博客 4万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Redis封神】Redis核心全解:五大基础结构、缓存三大问题、持久化、过期淘汰、分布式锁、高可用面试

穿透:查不存在数据,一直打库;单个热点Key过期,瞬时并发打库;大量Key同时失效/服务宕机,全局打库崩服务。本文作为系列终章,完整拆解Redis全套核心体系:高性能原理、五大数据结构场景、过期删除与内存淘汰、缓存三大问题、RDB/AOF持久化、分布式锁核心问题、三级高可用架构,全覆盖面试与工程实战重难点。内存单线程造就高性能,过期双删控内存;穿透查无、击穿单点、雪崩全局;RDB快稳、AOF安全,Redisson解决锁难题,集群架构保高可用。至此,十天计算机硬核知识系列全部完结!

2401_86195313的博客 328

2024年Redis面试必杀技:从入门到吊打面试官(万字避坑指南)

(敲黑板)Redis用epoll系统调用实现了非阻塞IO,单个线程就能处理数万个连接请求,这才是真正的"一夫当关万万夫莫开"!最后送大家一句话:纸上得来终觉浅,绝知此事要躬行!先来道送分题(实际工作中80%开发者答错):Redis单线程为什么吞吐量能到10万+?实际项目中的骚操作:用ZSet实现延迟队列,score存时间戳,轻松搞定订单超时!这样AOF文件前半段是RDB格式,后半段是增量命令,兼顾速度和数据安全!但SYNC是重量级操作,改进方案PSYNC2.0支持断点续传!Redis如何实现事务?

pythonpapaxia的博客 855

B站普通人和高手系列面试题

1.Spring 中Bean的作用域有哪些 2.Dubbo是如何动态感知服务下线的? 3.那你说说Mybatis里面的缓存机制吧? 一级缓存sqlseesion二级缓存cachingExecutor 装饰模式mapper的namespace 4.Spring中事务的传播行为有哪些? 一共有7种 5.为什么要使用Spring 框架? 6.请简述一下伪共享的概念以及如何避免? 原因缓存行,解决对其填充,使用@contented注解 7.谈谈你对线程安全的理解? 多线程情况下不管怎么执行结果都

xchnba2107的博客 853

京东方Java实习面经

本篇是1000期面试系列文章的第141期,持续更新中.....这里---->获取50本面试经验总结本文内容来自于一位网友的京东方面试,相对前面的小米一面,难度就增加了不少,估计很多实...

田维常 778

面了个五年开发,问了些Redis经典问题,总结分享!

作为缓存工具,Redis最广为人知的特点就是快,到底有多快呢?Redis单机qps(每秒的并发)可以达到110000次/s,写的速度是81000次/s。那么,Redis为什么能这么快呢?当面试官问到这个问题,大家能秒答出来吗?问题不难,仅仅是面试官一个基础摸底的问题,但是如果没有全面理解Redis,面试时就很难完整答出来。而下面的面试题则偏重实战,以代码为主,代码后面发给大家。这些更加考验大家的能...

qq_14958051的博客 217

国内最火的内存数据库,110000 QPS 没有之一!

作为缓存工具,Redis最广为人知的特点就是快,到底有多快呢?Redis单机qps(每秒的并发)可以达到110000次/s,写的速度是81000次/s。那么,Redis为什么能这么快呢?大家能秒答出来吗?问题不难,仅仅是面试官一个基础摸底的问题,但是如果没有全面理解Redis,面试时就很难完整答出来。而下面的面试题则偏重实战,以代码为主,代码后面发给大家。这些更加考验大家的能力和技术运用,大家可以...

Java团长的博客 1070

Java后端面试7天冲刺:HashMap、JVM、并发、MySQL、Redis、Spring核心考点精讲

如果你正在准备2026年的Java后端开发面试,并且感觉知识点太多、时间太紧、不知道从哪里开始,那么这篇文章就是为你准备的。 这不是一份简单的知识点罗列,而是一个经过验证的、可执行的“面试急救计划”。核心假设是:你只有一周左右的冲刺时间,每天能投入2-3小时。我们的目标不是成为某个领域的专家,而是在有限时间内,最高效地覆盖面试官最可能问到的核心考点,并建立清晰的回答框架。 为什么是这些主题?从近年的面试趋势看,面试官早已厌倦了死记硬背的“八股文”。他们更倾向于通过 HashMap、JVM、并发编程 这些“经

weixin_33770878的博客 337
上一篇: 【MySQL技术内幕】:InnoDB存储引擎体系架构及关键特性
下一篇: 看了架构师的代码,切身感受到了代码可扩展性高的魅力
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值