美文网首页
什么是缓存雪崩、穿透、击穿?解决方案?

什么是缓存雪崩、穿透、击穿?解决方案?

作者: 就这些吗 | 来源:发表于2019-12-11 22:29 被阅读0次

    缓存雪崩:

    同一时间redis中的key大面积失效,那一瞬间Redis跟没有一样,所有请求都落到了数据库上。
    解决方案:
    1.设置缓存的失效时间加一个随机值。

    setRedis(Key,value,time + Math.random() * 10000);
    

    2.设置缓存永不过期,比如电商的首页,需要改动的时候再去改动value值就行。

    缓存穿透:

    是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
    解决方案:
    1.对参数在后台进行判断限制,比如id<0的直接拦截,再比如分页查询,一口气查Integer.MAX_VALUE,肯定会导致方法执行速度变慢。
    2.对没有查到的数据也放在redis中,不过value为null,这样以后的请求就会落到redis了
    3.redis中的布隆过滤器
    4.用nginx对单个ip访问超出阈值的都拉黑。

    缓存击穿:

    这个跟缓存雪崩有点像,但是又有一点不一样,缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
    解决方案:
    1.设置热点数据永远不过期。
    2.对查询的sql加上互斥锁,那一次就只有一个查询请求,其他一样的请求都会阻塞,查完之后也到了redis中,不会有其他过期后被击穿的问题了。
    3.对查询加上一个分布式锁(可以由redis、zookeeper等实现),redis的话实现需要lua来保证查询和释放锁的原子性。
    4.分级缓存,采用 L1 (一级缓存)和 L2(二级缓存) 缓存方式,L1 缓存失效时间短,L2 缓存失效时间长。 请求优先从 L1 缓存获取数据,如果 L1缓存未命中则加锁,只有 1 个线程获取到锁,这个线程再从数据库中读取数据并将数据再更新到到 L1 缓存和 L2 缓存中,而其他线程依旧从 L2 缓存获取数据并返回。

    相关文章

      网友评论

          本文标题:什么是缓存雪崩、穿透、击穿?解决方案?

          本文链接:https://www.haomeiwen.com/subject/ssqpgctx.html