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包

        
            com.google.guava
            guava
            22.0
        

你可能感兴趣的:(java,redis,数据库,缓存)