在互联网时代,大流量、海量数据、高并发是每个企业都渴望和害怕的术语。欲望是因为它们代表了用户提供的服务是愿意付费的、有价值的;恐惧是因为一旦所有用户都上来了,系统就无法正常为用户提供服务,让用户失望,最后选择离开。仅仅靠服务器资源的超高配置还是很难支持高并发的场景。所以我们需要缓存。
缓存在计算机世界中无处不在。CPU有一级二级三级缓存,TLB以Linux操作心态加速虚拟地址和物理地址的转换,redis数据库以应用服务缓存数据,浏览器或应用有本地缓存。可以说缓存很重要。有了它,整个世界似乎都变好了。刷网页的时候很快就能把数据拿回来,不用一直等。
让我们举一个简单的例子来看看什么是缓存。我们知道数据存储在数据库中,数据库数据通常存储在磁盘上。当用户从前端请求时,直接访问磁盘的数据库数据会非常慢。如果有缓存,在用户请求到达后,业务线程将首先访问缓存。如果缓存命中,会直接返回给用户。如果没有命中,会继续请求磁盘数据库数据,获取后返回给用户。同时,磁盘获得的数据将被写回缓存系统,为下一次请求做准备。
但是这么强大的缓存系统,其实有很多问题,就是缓存雪崩、缓存击穿、缓存穿透。但是不要害怕。有问题就有解决办法。让我们慢慢往下看。
所谓缓存雪崩,就是大量缓存的数据同时失效,所有请求都命中数据库,导致数据库在巨大的压力下挂掉。比如双十一期间,用户会开淘宝买东西。有的人确实需要买东西,有的人只是凑热闹。反正这个时候首页压力很大。为了满足所有用户对数据的访问,阿里程序员将主页数据缓存在redis中,并将redis的到期时间设置为12小时。我们知道redis是内存数据库,所以访问速度非常快。数据缓存后,用户买的很开心,程序员也很开心,系统依然完好...12个小时慢慢过去了,用户购物的热情并没有减弱,但是大量的用户请求却来了。然而,主页redis中缓存的数据已经完全失效。此时redis中没有数据,用户请求直接扑向数据库。数据库怎么承受得住直接崩溃?
为了应对缓存雪崩,我们也有一些措施,比如随机设置密钥的到期时间,避免大量密钥同时失效,比如不设置到期时间或者设置到期时间过长,或者运行定时任务,随时监控缓存,在到期前刷新新的缓存。
所谓缓存穿透,就是数据没有缓存在缓存中,导致请求直接到达数据库,数据库挂在很大的压力下。比如双十一期间,一个黑客发现网站上没有混沌炸鸡的产品(假设产品ID为-1),于是写了一个脚本大量请求这个产品。redis缓存我只有炸鸡产品,不满足需求,他就放数据库里,所有的请求都放数据库里。数据库说我也没有,但是不断的轮询,结果直接崩溃了。
我们也有一些措施来处理缓存渗透。比如redis时将一些不存在的数据缓存设置为null,比如检查请求参数,非法直接拦截,比如增加安全保护,定期扫描,发现异常数据直接将请求的IP地址加入黑名单。
所谓缓存崩溃,是指缓存的热数据突然失效,导致大量请求访问数据库,数据库承受不了压力,直接挂机。比如双十一期间,iPhone12可以在凌晨00:00-01:00之间抢购1美分。哇,这个真便宜。程序员也预测到了产品的受欢迎程度,于是将iPhone12的产品信息缓存在redis中,设置为1小时过期。IPhone12是一款新产品,吸引了1亿人的关注。男人、女人和孩子都蜂拥购买一部iPhone。59分钟时,redis中iPhone12的数据突然过期。这时候大量的请求去了数据库,数据库直接崩溃了。
为了处理缓存崩溃,我们也有一些措施,比如设置热数据永不过期,比如锁定数据。当一个线程不能请求数据时,其他用户线程也不能请求数据,直到第一个线程得到数据,才去redis缓存,而其他线程仍然从缓存中取数据,比如服务降级,直接返回“货太热,系统休息一会儿”。
通过这篇文章的介绍,相信你对缓存、缓存雪崩、缓存击穿、缓存穿透有了相应的了解。当你的业务由于高并发、大数据量而准备启用缓存策略时,你要针对缓存带来的雪崩、崩溃、渗透等问题采取防护措施,让大家玩得开心~
-结束-
1.《雪崩击穿 原来缓存也会雪崩、击穿、穿透啊》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《雪崩击穿 原来缓存也会雪崩、击穿、穿透啊》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/714720.html