您的位置:首页 > 数据库 > Redis

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

2020-06-11 16:26 197 查看

提到redis肯定会提到缓存,那么在redis的缓存中会遇到哪些问题呢。下面我们来一一谈谈:

       首先我们来聊一个场景,假设你有很多个请求去访问同一个接口,而且你的key是不存在的,首先在redis中缓存是无法命中,当redis中没有查到是,我们又会去DB中去查询,那么N多个请求都去DB中查询,当服务很多是,DB甚至会崩掉。那么这种情况在Redis中我们称之为缓存穿透。那么我们遇到这种情况会怎么解决呢,首先我们可以限流,限制同一个请求在一定时间内的访问次数。或者我们可以用一个空的值的缓存放入redis中,设置一个有效期避免所有的请求都查询,减轻数据库的压力。

       那么如果是redis中key值过期了,那我们在N多个请求中,是不是又要有N多个请求同时在redis中写缓存呢,这样就会导致数据库的压力很大。在中情况称为缓存击穿,那么我们一般的解决办法是设置key值或者经常用的key值永不过期,或者分布式锁,就不会遇到这种情况了,高大上一点就是用布隆过滤器了(提前预热)。

      布隆过滤器是一个是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。

     在实际应用中我们要导入依赖

     <dependency>     

        <groupId>com.google.guava</groupId>   

        <artifactId>guava</artifactId>     

       <version>25.1-jre</version>

  </dependency>

         缓存雪崩指缓存服务器重启或者大量的缓存集中在某个时间段失效,突然给数据库产生了巨大的压力,甚至击垮数据库的情况。解决思路:对不用的数据使用不同的失效时间,加上随机数

       如有发现总结不到位的请留言,谢谢。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐