Redis缓存穿透问题和解决方案

1. 什么是缓存穿透以及危害? 

缓存穿透:指请求的key在缓存中没有对应的数据,此时去查找数据库,结果发现数据库也没有数据或者数据库有数据但没有存进缓存,最终导致缓存中一直找不到数据,查询都是直接访问数据库。如果有大量请求并发访问,瞬时数据库的压力会很大,容易造成服务宕机。

2. 解决缓存穿透的方案 

1)设置空缓存如果查询数据库也为空的时候,把这个 key ,值为null 缓存起来,这样在下次请求过来的时候就可以走缓存了;弊端:如果受到“洪水攻击”,key肯定是变着样来,空缓存会越来越多,也会占满内存,服务也就挂了,缓解这个问题设置缓存过期时间15秒,但也是治标不治本。

2)对参数进行一些规则限制认证,比如根据 商品id 查询某商品,在查询之前我们可以对这个 id 做认证,看是不是符合规范,比如id的位数,类型,包含特殊字符等,当不符合的时候就直接返回默认的值,既不用去缓存中查询,也不用操作数据库了。这种方案可以解决一部分问题,使用场景比较少。

3)双重检测加锁  (这里说错了,应该是防止缓存击穿)(14条消息) Redis在并发发情况下,发生多次访问数据库_ldj2020的博客-CSDN博客_redis访问数据库

4)使用布隆过滤器,来实现对缓存 key 的检验,需要将所有可能缓存的数据 Hash 到一个足够大的 BitSet 中,在走缓存之前先从布隆过滤器中判断这个 key 是否存在,然后做对应的操作。

3. 布隆过滤器介绍

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率且删除困难。

4. 布隆过滤器的使用 

新建一个maven工程,引入guava包

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>22.0</version>
        </dependency>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值