网站改版对seo,本溪建设网站,沈阳模板建站方案,wordpress看流量一、概念介绍 缓存穿透#xff1a;
定义#xff1a;缓存穿透指的是请求查询缓存和数据库中都不存在的数据#xff0c;从而导致每次请求都直接访问数据库。 原因#xff1a;通常是由于恶意请求、非法输入或系统漏洞导致的。攻击者故意提交无效的查询#xff0c;绕过缓存直… 一、概念介绍 缓存穿透
定义缓存穿透指的是请求查询缓存和数据库中都不存在的数据从而导致每次请求都直接访问数据库。 原因通常是由于恶意请求、非法输入或系统漏洞导致的。攻击者故意提交无效的查询绕过缓存直接访问数据库。 影响频繁的缓存穿透会导致数据库负载增加消耗额外的资源并可能引起拒绝服务Denial of Service攻击。 缓存击穿
定义缓存击穿指的是一个热点数据失效或被删除后大量并发请求同时到达系统并请求该数据导致缓存无法命中而直接访问数据库。 原因通常是由于热点数据过期、手动删除、大量并发请求或非法请求引起的。 影响缓存击穿会导致数据库负载剧增大量请求直接访问数据库降低了系统性能甚至可能导致数据库崩溃。 缓存雪崩
定义缓存雪崩指的是缓存中大量数据同时失效或缓存系统不可用导致大量请求直接访问数据库对数据库造成巨大压力。 原因通常是由于缓存过期时间集中、缓存依赖关系或缓存系统故障引起的。 影响缓存雪崩会导致系统性能下降、响应延迟增加甚至系统崩溃严重影响系统的可用性。 综上所述缓存穿透是指访问缓存和数据库都不存在的数据缓存击穿是指热点数据失效导致请求直接访问数据库而缓存雪崩是指大量缓存数据同时失效或缓存系统不可用导致大量请求直接访问数据库。这些问题都会对系统性能、可用性和安全性造成负面影响。
二、 缓存击穿 2.1 定义 缓存击穿缓存击穿是指在使用缓存的场景下当某个热点数据失效或不存在时大量并发请求同时访问该数据导致请求都穿透缓存直接访问后端数据库造成数据库负载过大。解决方案通常包括加锁、互斥锁、预加载等方法。
2.2 缓存击穿通常发生在以下情况下 热点数据失效当某个热点数据的缓存失效并且有大量请求同时访问该数据时会导致缓存击穿。
冷启动问题当系统刚启动或者缓存被清空时大量请求同时访问未缓存的数据也会引发缓存击穿。
2.3 缓存击穿解决方案 加锁机制在请求缓存失效时只允许一个请求去查询数据库其他请求等待。当第一个请求完成数据库查询后将结果回写到缓存中其他请求再从缓存获取数据。这样可以避免大量请求同时访问数据库。
互斥锁Mutex在缓存失效时利用互斥锁机制阻止并发请求查询数据库。通过在代码层面加锁保证只有一个线程执行查询操作其他线程等待并直接从缓存获取数据。
预加载Cache Pre-warming在系统启动或空闲期间预先将热点数据加载到缓存中。这样可以避免冷启动时大量请求直接访问数据库。
设置短暂的缓存过期时间当缓存失效后设定较短的过期时间避免大量请求在同一时间窗口内访问数据库。
响应穿透检测在缓存层对请求进行合法性检测如果请求的数据在数据库中不存在可以将该键对应的缓存值设置为空值或者特殊标记避免反复查询数据库。
三、 缓存穿透 3.1 定义 缓存穿透缓存穿透是指查询一个不存在于缓存和数据库中的数据导致每次请求都必须查询数据库而且该数据永远不存在于缓存中从而浪费了大量的数据库资源。缓存穿透可能因为恶意攻击、非法请求或者系统错误等原因引起。解决方案通常包括设置空值缓存、布隆过滤器、热点数据预加载等方法。
3.2 发生场景 恶意请求攻击者故意发送无效的查询或非法输入以绕过缓存直接访问数据库。
数据库中不存在的数据频繁查询缓存和数据库中都不存在的数据。
3.3 解决方案 布隆过滤器Bloom Filter使用布隆过滤器来过滤掉那些明显不存在于数据库中的请求。布隆过滤器是一种高效的数据结构它可以快速判断某个元素是否存在于集合中。
缓存空对象Cache null objects当查询数据库后发现数据不存在时将结果也缓存下来但设置一个较短的过期时间。这样在下一次请求相同数据时就可以从缓存中获取结果而不需要再次访问数据库。
异常请求拦截Request filtering对于异常请求或频繁请求的IP地址可以采取一定的限流或封禁策略以减轻对数据库的负载。
缓存预热Cache warming在系统启动或低峰期提前将一些热门数据加载到缓存中避免冷启动时大量请求直接访问数据库。
数据合法性校验在接收到请求后进行合法性校验例如检查参数的有效性、鉴权等避免非法请求绕过缓存直接访问数据库。
异步加载数据对于不存在于缓存中的数据可以通过异步方式加载数据并将其缓存起来。这样在下一次请求相同数据时就可以从缓存中获取结果而不需要再次访问数据库。
四、 缓存雪崩 4.1 定义 缓存雪崩是指在缓存中的大量数据同时失效或者缓存系统不可用导致大量请求直接访问数据库从而对数据库造成巨大压力。这种情况下数据库可能会无法承受如此大的并发请求负载导致系统性能下降甚至崩溃。
4.2 发生场景 缓存过期时间集中当大量缓存的过期时间设置在相近的时刻或者由于缓存系统异常导致所有缓存同时失效会导致大量请求在同一时间窗口内穿透缓存去查询数据库。
缓存依赖关系如果缓存之间存在依赖关系并且其中一个缓存失效后其他缓存也无法得到有效更新会导致相关依赖的数据请求直接访问数据库。
缓存系统故障当缓存系统发生故障且无法提供服务时所有的请求都无法命中缓存只能直接请求数据库使得数据库承受巨大的负载压力。
4.3 解决方案 使用多级缓存和热点数据预加载减少缓存失效的风险。
合理设置缓存过期时间避免过多缓存同时失效。
设置随机的缓存过期时间避免大量缓存在同一时间失效。
实施缓存的容灾备份确保即使一个缓存节点故障整个系统仍能正常运行。
在关键路径上增加限流措施避免过多请求同时访问数据库。
五、小栗子 举个例子就类似于百度这种搜索场景。 如果每天大量的人搜索数据然后去mysql等这种数据库的磁盘中查询数据。在磁盘中读取数据比较慢会对数据库造成很大压力。
所以 将一些很多人访问的数据称为热点数据缓存到redis中。 用户进行搜索的时候是先去redis 查询数据如果有数据则直接返回如果在redis中查不到数据然后再去查mysql这种数据库。这样是比较消耗性能的
热点数据就是某一段时间内用户大量访问数据。比如设置某条数据如果十分钟被访问超过5次则称为热点数据存在redis中。某条热点数据在十分钟内被访问没有超过5次则会被释放掉。
redis缓存穿透 缓存穿透是指缓存和数据库中都没有的数据而用户不断发起请求。由于缓存是不命中时被动写的并且出于容错考虑如果从存储层查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到存储层去查询失去了缓存的意义。
先查redis缓存查不到再去查存储层 这样是非常消耗性能的。
在流量大时可能DB就挂掉了要是有人利用不存在的key频繁攻击我们的应用这就是漏洞。
缓存击穿 缓存击穿是指缓存中没有但数据库中有的数据一般是缓存时间到期这时由于并发用户特别多同时读缓存没读到数据又同时去数据库去取数据引起数据库压力瞬间增大造成过大压力。
利用缓存击穿攻击 还是举搜索的例子redis存的是热点数据。普通用户进行搜索时先读取redis缓存如果读不到才去mysql数据中读。
当别人攻击时它会利用大量的生僻词去进行搜索这些数据在redis里没有会去读取mysql磁盘消耗大量的性能。 并且使用 这些生僻的词变成热点数据存贮在redis缓存中。
此时正常用户再去访问时在redis缓存中存贮的都是生僻的词查不到他们的数据则会再次去mysql中查询数据。造成性能的消耗。