在互联网时代,大流量、海量数据、高并发是每个企业都渴望又害怕的名词,渴望是因为它们代表着提供的服务用户愿意买单、有价值;害怕是因为一旦用户全上来了,系统不能正常为用户提供服务,让用户失望,最终选择离开。仅靠着超高配置的服务器资源,还是很难支撑高并发的场景。因此我们需要缓存。

缓存在计算机的世界里无处不在,在CPU中有一级二级三级缓存,在Linux操作心态中有TLB加速虚拟地址和物理地址的转化,在应用服务中有redis数据库进行数据缓存,在浏览器或app中有本地缓存。可以说缓存是非常重要了,有了它,整个世界仿佛都变美好了,刷网页很快就有数据的返回,再也不用一直苦苦等待了。

通过一个简单的例子来看看缓存是什么?我们知道数据都是存储在数据库里的,而数据库数据一般都存储在磁盘上。当用户请求从前端过来时,如果直接去访问获取磁盘的数据库数据,就会非常慢。如果有了缓存,在用户请求到达之后,业务线程就会先访问缓存,如果缓存命中就直接返回用户,如果没有命中,则继续请求磁盘数据库数据,获取后返回用户,同时将磁盘获取的数据结果回写到缓存系统,为下次请求做好准备。

可是这么强大的缓存系统,其实也存在很多问题呢,那便是缓存雪崩、缓存击穿、缓存穿透。不过也不要害怕,有问题就有解法,我们慢慢的往下看。

缓存雪崩

所谓缓存雪崩,指的是缓存数据同一时间大量失效,所有的请求全打到数据库,导致数据库在巨大压力下挂掉。比如在双十一的时候,用户都会打开淘宝买东西,有的人是真的有需要买的,有的人就是凑个热闹,不管怎么样,这时候首页的压力就非常大了,为了满足所有用户都可以访问到数据,阿里的程序员们将首页数据缓存到redis里,并设置redis失效时间是12小时。我们知道redis是内存数据库,那访问速度,杠杠的啊。数据缓存后用户们买的很开心,程序员们也很开心,系统都还好着呢……慢慢的12个小时过去了,用户购物的热情不减啊,还是大量的用户请求在过来,然而首页redis缓存的数据全失效了,这时候redis里没有数据了,用户请求直接扑向数据库,数据库哪能扛得住啊,直接垮掉。

应对缓存雪崩,我们也有一些办法,比如随机设置key的失效时间,避免大量的key同时失效,比如不要设置过期时间或把过期时间设置得很长,再比如运行定时任务,随时监控缓存情况,在失效前刷新进新的缓存。

缓存穿透

所谓缓存穿透,指的是缓存中没有缓存到该数据,从而导致请求直接到达数据库,数据库在巨大压力下挂掉。比如在双十一的时候,有黑客经过多次攻击测试发现混沌炸鸡(假设商品ID为-1)这个商品在网站上没有,于是便写了一个脚本,大量的去请求这个商品,redis缓存一看我只有炸鸡商品,不满足需求啊,于是就放到数据库那里了,所有的请求全放给数据库了,数据库说我也没有啊,但还是不断地被接受轮询,结果直接垮掉。

应对缓存穿透,我们也有一些办法,比如对于某些不存在的数据缓存在redis时设置为null,比如对请求参数进行校验,不合法的直接拦截,比如增加安全防护,定期扫描,有发现不正常的数据直接将该请求的IP地址加入黑名单。

缓存击穿

所谓缓存击穿,指的是缓存的热点数据突然失效导致大量的请求都去访问数据库,数据库扛不住压力,直接挂掉。比如双十一的时候,iPhone12在凌晨00:00-01:00可1分钱抢购,哇,这个可是真便宜呢,程序员们也预测到了商品的火爆,于是将iPhone12的商品信息缓存到redis中,设置了1小时过期。iPhone12是新推出的商品,引起了一亿人的关注,男女老少全都蜂拥而至,只为了抢购一个iPhone,到了59分的时候,突然iPhone12在redis的数据过期了,这时候大量的请求都到了数据库,数据库直接垮掉了。

应对缓存击穿,我们也有一些办法,比如设置热点数据永不过期,比如给数据加锁,当有线程请求不到数据时,其它的用户线程也无法请求数据,直到第一个线程拿到数据后,去redis缓存起来,其它的线程仍然走缓存拿数据,比如服务降级,直接返回“商品太火爆了,系统暂时休息会儿”。

通过本文的介绍,相信你对缓存、缓存雪崩、缓存击穿、缓存穿透也有了对应的了解了吧。当你所在的业务因为高并发、大数据量准备启用缓存策略时,对于缓存可能带来的雪崩、击穿、穿透问题要做好防护措施,这样大家都可以开开心心的玩耍了~

今天带你们走进缓存的雪崩、击穿、穿透基本概念相关推荐

  1. 顶级“Redis学习笔记”,缓存雪崩+击穿+穿透+集群+分布式锁,NB了

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  2. 带你走进缓存世界(2):缓存入门

    昨天在群里有个朋友问,如何使用数据库的临时表.问其原因,原来是他想把查询的结果导出excel,但是苦于查询结果是100个里面随机挑出50个,所以他想把查询结果放在临时表里,导出的时候查询临时表.这个方 ...

  3. Redis缓存的雪崩、穿透、击穿

    前言: 使用缓存的主要目的是为了提高系统的响应速度.减轻数据库的压力.那么一个正常的缓存流程是怎样的呢,看下如下步骤: 1.用户发起查询请求 2.请求来到redis缓存,在缓存中查询到了数据,将缓存中 ...

  4. 缓存雪崩 击穿 穿透

    缓存穿透 **缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意 ...

  5. 带你走进缓存世界(1):漫谈缓存

    什么是缓存?对于刚入门的朋友来说可能比较模糊,或是只知道是个提高性能的东东.我按我的理解说一下:缓存的目的就是为了提高性能,而把一些数据存放在内存里,方便程序反复使用,所以缓存就是放在内存里的那些数据 ...

  6. 带你走进缓存世界(3):缓存原理

    上次我们了解了缓存的基本使用技能,也知道为什么要用缓存,但只是单单谈到了缓存的优势的一点:就是缓存避免的重复性的耗时操作,提高系统性能.其实,如果缓存使用不当,会适得其反.为了避免这种情况的发生,我们 ...

  7. redis的雪崩 击穿 穿透以及解决方案

    雪崩:众多缓存数据同一时间到期导致大量请求同时达到数据库,致使数据库超负荷. 解决方案: 1.数据对时间不敏感:到期时间加一个随机值 2.数据必须在某一时刻到期:客户端请求的时候加个延迟. 击穿:某一 ...

  8. redis 雪崩 击穿 穿透

    雪崩,redis大面积key失效,导致大量请求落到了DB上 击穿,单一key失效,导致大量请求落到DB上 穿透,redis与DB中都没有这个key,导致穿透

  9. 大白话5分钟带你走进人工智能-第二十二节决策树系列之概念介绍(1)

                                                                第二十二节决策树系列之概念介绍(1) 本系列我们讲一个新算法及其衍生出来的系列算 ...

最新文章

  1. 数据结构5: 链表(单链表)的基本操作及C语言实现
  2. java 柱状图下载_(JFreeChart)Java图表制作
  3. 深度优先搜索和广度优先搜索的比较与分析
  4. php记录网站访问,PHP简单实现记录网站访问量的功能
  5. ZooKeeper官方文档资源
  6. exfat分配单元大小选多少_NTFS/exFAT/FAT32,这三个常见选项是什么意思?
  7. LOJ #516. 「LibreOJ β Round #2」DP 一般看规律
  8. spring data mongodb CURD
  9. 微信小程序登录 code 40029 天坑
  10. java微信公众号支付示例
  11. 来自阿里十余年的老架构师自述:成为架构师你只差了一步
  12. php 同比增长率上期未0,同比增长率计算时,上期值为0怎么计算?
  13. 计算机wmi配置错误,系统没有WMI服务、WMI错误修复办法
  14. MySQL 5.7.17.0 下载安装笔记
  15. 这才是全规格样式车牌识别,秒杀各种“不服”
  16. mysql 表锁 MDL锁 行锁
  17. 黄聪:黄金分割——设计师的设计利器
  18. cad拉伸怎么用_【cad比例缩放教程】cad缩放怎么用?
  19. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别介绍
  20. 无线pda是快递员随身携带的设备

热门文章

  1. 国家自然科学基金委公布生命科学部四类科学问题典型案例
  2. 16S+功能预测发Sciences:尸体降解过程中的微生物组
  3. 你的肠道菌群是遗传自你父母,还是后天环境塑造的?
  4. excel中使用CORREL函数计算两个时间序列数据列之间的滚动相关性(Rolling correlations)、例如,计算两种商品销售额之间的3个月的滚动相关性
  5. R语言KMeans聚类分析确定最优聚类簇数实战:间隙统计Gap Statistic(确定最优聚类簇数)
  6. R语言使用table函数计算单分类变量的频率表(frequency table)、使用prop.table函数将table函数计算获得的频率表转化为比率表、返回单分类变量每一个类别的比率、或者百分比
  7. R语言使用gt包和gtExtras包优雅地、漂亮地显示表格数据:使用gt包可视化表格数据,使其易于阅读和理解、使用gtExtras包添加一个图,显示表中某一列中的数字
  8. R语言unlist函数将复杂数据(list列表、dataframe、字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)
  9. R语言层次聚类(hierarchical clustering):特征缩放、抽取hclust中的聚类簇(cutree函数从hclust对象中提取每个聚类簇的成员)、基于主成分分析的进行聚类结果可视化
  10. 机器学习数据预处理之缺失值:插值法填充+ lagrange插值+拉格朗日插值