缓存之缓存击穿缓存穿透和缓存雪崩

ShuSheng007 ShuSheng007     2023-01-15     289

关键词:

[版权申明] 非商业目的注明出处可自由转载
出自:shusheng007

概述

由于云服务的快速发展,分布式已经成为当今大中型IT架构事实标准。而分布式缓存也基本成为其中的基础设施,在此方面Redis已经获得全面胜利。

为什么要使用缓存

主要思想还是以空间换时间,为了节约CUP及IO资源,进而提高系统的吞吐量及响应速度。如果你的CUP及IO资源完全足够,那就没有必要引入缓存,因为任何事物都具有两面性,缓存也一样。

缓存常见问题

在大中型分布式系统中,数据库非常容易成为整个系统的瓶颈,所以现在基本都会以Redis构建挡在数据库之前的那层缓存,以便某些请求可以不经过数据库直接在缓存层返回。但如果不做任何保护,有时缓存层仍然挡不住来袭之敌,最后量大了就把数据库打崩溃了。下面就列举几种情况。

缓存穿透

听听这名字,太吓人了

  1. 什么是缓存穿透

当一个请求过来,缓存与数据库中都不存在要请求的数据,所谓的穿透了,因为不仅是缓存层,就连数据库层都穿过去了,所以说穿透了。一个两个没事,就怕瞬时大量这样的请求,那数据库就死给你看了。

  1. 场景及解决方案

场景1:由正常业务引起。正常业务中刚好就是有这种数据库中没有数据的操作,这种
方案:给这样的key设置null作为缓存,然后设置一个很短的缓存过期时间

场景2:外部的恶意攻击。有人专门构造你缓存与数据库不存在数据的请求来恶意攻击你。
方案:这种场景第一种解决方案可能无能为力了,因为攻击者可能构建大量随机不重复的key去获取数据。这种情况可以使用布隆过滤器

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中
如果布隆过滤器判定某个 key 不存在,那么就一定不存在,如果判定某个 key 存在,那么很大可能是存在(存在一定的误判率)

缓存击穿

  1. 什么是缓存击穿

这里的缓存击穿特指缓存中的某个热点数据失效,请求直接打到了数据库上。也就是说缓存没有命中,直接被击穿了,但是数据库中是存在数据的。

  1. 场景及解决方案

场景:
有的同学要问了:既然数据库有值,访问数据库后将数据回填到缓存不就好了?你说的很对,所以缓存击穿专门描述的是热点数据被击穿造成的问题。热点数据会存在存在大量并发,假设一下来了10000个不分先后的请求去访问同一条数据,关键缓存中还没有,那么就直接到了数据库,那么数据库扛不住就崩溃了。

方案:
由于是因为并发访问失效的热点数据的缓存造成的,所以就要从这并发失效两方面解决。

如果从并发的角度解决的化,我们很容易想到加锁。当第一个请求到达的时候就加锁,其他请求都等着,第一个请求从数据库中获取数据后就会回填到缓存中的,然后释放锁。那接下来的请求就不用加锁了,因为此时缓存中已经存在数据了。

如果从失效角度解决的化,我们很容易想到让热点数据“不失效”,永不失效实际包含两层意思:

  • 物理不过期,针对热点key不设置过期时间

  • 逻辑过期,由程序员负责更新数据。例如把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建

缓存雪崩

这名字更唬人,我第一次看见这个名词时联想到的就是天崩地裂,是不是缓存服务器崩了?后来证明有时望文生义也不是全然不对,至少缓存服务器崩了确实会导致缓存雪崩,哈哈。。。

  1. 什么是缓存雪崩

缓存雪崩是指由于缓存中大批缓存数据同一时刻失效,那么访问这些数据的请求都会击穿缓存,直接到达数据库,数据库死给你看的情形。

  1. 场景及解决方案

场景1:缓存服务器宕机了,那肯定就满足大批缓存同时失效的情形啦。
方案: 不要让它宕机。例如如何保证Redis高可用性有很多种方式,最可靠的当然是集群部署,自己查询相关资料即可。

场景2:设置了大量同一时刻失效的缓存
方案: 使缓存均匀过期,设置不同的过期时间,让缓存失效的时间尽量均匀。

总结

你get到了吗?同时我又一次惊叹于汉语的博大精深,自从喊出祖国有力量,民族有信仰,人民有希望的口号后,文化就自信了很多。

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis的缓存问题之缓存穿透缓存雪崩缓存击穿(代码片段)

目录一、什么是缓存穿透?二、常见的解决方案有两种:1、缓存空对象2、布隆过滤综上所述三、编码解决商品查询的缓存穿透问题四、缓存雪崩问题及解决思路1、什么是缓存雪崩?五、缓存击穿问题及解决思路 1、... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis——缓存穿透缓存击穿缓存雪崩分布式锁(代码片段)

文章目录:1.缓存穿透1.1什么是缓存穿透?1.2缓存穿透的解决方案2.缓存击穿2.1什么是缓存击穿?2.2缓存击穿的解决方啊3.缓存雪崩3.1什么是缓存雪崩?3.2缓存雪崩的解决方案4.分布式锁4.1使用setnx+del实现分布式... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis08_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis缓存雪崩缓存穿透缓存击穿

Redis缓存雪崩、缓存穿透、缓存击穿Redis缓存过程缓存雪崩解决方案永不过期合理的设置过期时间使用Redis的分布式锁缓存穿透解决方案过滤非法查询缓存空对象布隆过滤器布隆过滤器的新增布隆过滤器的查询布隆过滤器的删除布... 查看详情

专项测试系列-缓存击穿穿透雪崩专项测试

作者:刘须华一、背景概述: R2M缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源... 查看详情

redis的缓存穿透缓存雪崩缓存击穿问题的概念与解决办法(代码片段)

详细介绍了Redis的缓存穿透、缓存雪崩、缓存击穿等问题的概念与解决办法。文章目录1缓存穿透1.1什么是缓存穿透?1.2怎么解决1.3BloomFilter布隆过滤器1.3.1BloomFilter的原理1.3.2BloomFilter的优缺点1.3.3GuavaBloomFilter1.3.4RedisBloomFilter2... 查看详情

缓存雪崩击穿穿透

   缓存雪崩:   为了保证缓存中的数据与数据库中的数据一致性,会给Redis里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库... 查看详情

缓存穿透缓存击穿缓存雪崩解决方案分析

前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。一、缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如... 查看详情

redis缓存雪崩缓存击穿缓存穿透原因,解决方案?(代码片段)

缓存雪崩、缓存击穿、缓存穿透原因,解决方案?缓存雪崩由于设置缓存时,key都采用了相同expire,导致缓存在某刻同时失效,请求全部直到DB,DB瞬时负载过重而雪崩解决方案在原有失效时间基础上增加一个随机值,比如1~5分钟... 查看详情

redis缓存穿透击穿雪崩到底是个啥?7张图告诉你(代码片段)

目录一、缓存是什么?二、缓存的作用和成本1、缓存的作用:2、缓存的成本:三、缓存作用模型1、根据id查询数据缓存流程四、缓存更新策略1、内存淘汰2、超时剔除3、主动更新五、缓存穿透解决方法:六、缓... 查看详情

redis缓存穿透缓存击穿缓存雪崩(面试必备)

啥也不说了,面试高频问题。一、缓存穿透用户想要查询一个数据,发现redis内存数据库中没有,也就是说没有命中缓存,也是会向持久层数据库查询,发现也没有,那么本次查询失败。如果此时,用户很多,高并发场景下都去... 查看详情

缓存雪崩击穿穿透

缓存雪崩、击穿、穿透前言一、缓存雪崩大量数据同时过期Redis故障宕机二、缓存击穿三、缓存穿透布隆过滤器总结前言用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机... 查看详情