社区网站开发,search搜索引擎,1年网站,和县网页定制一、缓存穿透
1、概念
缓存穿透#xff08;查不到数据#xff09;#xff0c;是指当用户想要查询数据的时候#xff0c;会先去Redis中取命中#xff0c;如果Redis中没有该数据#xff0c;那么就会向数据库中去查找数据。如果数据库中也没有#xff0c;则该次查询结果失…一、缓存穿透
1、概念
缓存穿透查不到数据是指当用户想要查询数据的时候会先去Redis中取命中如果Redis中没有该数据那么就会向数据库中去查找数据。如果数据库中也没有则该次查询结果失败。但是当我们的用户增多或者用户源源不断的发起请求redis中也没有命中全去访问了持久层数据库这就会导致数据库造成很大的压力这时候就相当于出现了缓存穿透。
如图所示Client发送请求若Redis中没有就把所有请求转向MySQL数据库当请求增多MySQL压力增大就会出现缓存穿透现象。
2、解决方法
①布隆过滤器(BloomFilter)
布隆过滤器是一种数据结构对所有可能查询的参数以hash形式存储先在控制台进行校验不符合则丢弃从而避免对底层数据库的压力。 布隆过滤器作用是判断数据是否存在集合之中正好和Redis这个缓存的场景相同如图所示当我们的数据到Redis之前先在BloomFilter检验如果数据不符合规范就丢弃减少对数据库的压力。
②缓存空对象
当存储层不被命中后即使返回一个空对象也将其缓存起来同时设置一个过期时间之后再访问这个数据会从缓存中取保护了后端的数据源。 缺点
a.如果空值被缓存起来则缓存需要更多的空间存储更多的键会有更多空的键
b.即使设置了过期的时间还是会在缓存层和存储层的数据会有一段时间窗口不一致这对需要保持一致性的业务会有影响。
二、缓存击穿
1、概念
缓存击穿查询的量太大是指一个key非常热点在不断的扛着大并发大并发集中的对这个点进行访问当这个key在失效的瞬间持续的大并发就穿透了缓存直接请求数据库由于是热点数据数据量很大在缓存过期的同时大量数据访问我们数据库并且回写到缓存会导致数据库瞬间压力过大。
2、解决方法
①设置热点数据永不过期
从缓存的层面来看没有设置过期时间所以不会出现热点key过期后产生的问题。
②加互斥锁
分布式锁使用分布式锁保证对于每个key同时只有一个线程去查询后端服务其他线程没有收获分布式锁的权限因此只需要等到即可。这种方式将高并发的压力转移到了分布式锁上因此对分布式锁的考验很大。如下图所示
三、缓存雪崩
1、概念
缓存雪崩是指在某一个时间段缓存集中过期失效redis宕机了。
如下图所示 2、解决方法
①Redis的高可用
既然redis可能挂掉那我们就可以多设置几台redis,搭建一个集群这样一来一台机器挂掉后其他的还可以继续工作。
②限流降级
在缓存失效后通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询寻数据和写缓存其他线程等待。
③数据预热
数据加热的含义就是正式部署之前我们把可能的数据预先访问一遍这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发前动手加载缓存中不同的key,设置不同的过期时间让缓存的时间点尽量均匀。
四、总结 这部分的内容是对b站up主【狂神说Java】内容的总结这里只是讲解了大概的原理让大伙知道有这些情况那后期呢博主会再出一期详细的博客讲解关于这些情况的具体实例以及一些相关算法讲解。如果对屏幕前的小伙伴有所帮助不要忘记点赞支持博主一波哦