美文网首页
缓存穿透、缓存击穿、缓存雪崩

缓存穿透、缓存击穿、缓存雪崩

作者: 蓝色Hippie | 来源:发表于2020-08-23 18:29 被阅读0次

一、缓存穿透

    1.什么是缓存穿透

    正常情况下,查询的数据都存在,如果请求一个不存在的数据,也就是缓存和数据库都查询不到的数据,每次都会去数据库查询,这种查询不存在的数据的现象称为缓存穿透

    2.带来的问题

    如果每次都拿一个不存在的id去查询数据库,可能会导致你的数据库压力增大

    3.解决方法

        3.1缓存空值

        之所以发生穿透,是因为缓存中没有存储这些数据的key,从而每次查询数据库的。我们可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库。当然为了健壮性,需要设置对应的过期时间

        3.2布隆过滤器bloomFilter

        BloomFilter 类似于一个hbase set 用来判断某个元素(key)是否存在于某个集合中

我们把有数据的key都放到BloomFilter中,每次查询的时候都先去BloomFilter判断,如果没有就直接返回null

注意BloomFilter没有删除操作,对于删除的key,查询就会经过BloomFilter然后查询缓存再查询数据库,所以BloomFilter可以结合缓存空值用,对于删除的key,可以在缓存中缓存null

二、缓存击穿

    1.什么是缓存击穿

    在高并发的情况下,大量的请求同事查询同一个key时,此时这个key刚好失效了。就会导致同一时间,这些请求都会去查询数据库,这样的现象称为缓存击穿

    2.带来的问题

    某一时刻的数据库请求量过大

    3.解决方法

    采用分布式锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询下数据库。

三、缓存雪崩

1.什么是缓存雪崩

当某一时刻发生大规模的缓存失效的情况,比如缓存服务器宕机

2.解决方法

    2.1采用集群,降低服务器宕机的概率

    2.2ehcache本地缓存+Hystrix限流&降级

    ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候,ehcache 本地缓存还能够支撑一阵

使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑

四、数据热点集中失效问题

    我们在设置缓存的时候,一般会给缓存设置一个失效时间,过了这个时间,缓存就失效了。

    对于一些热点的数据来说,当缓存失效以后会存在大量的请求过来,然后打到数据库去,从而可能导致数据库崩溃的情况

方案:

    1.设置不同的失效时间

    2.采用缓存击穿的解决办法,加锁

    3.永不失效,就是采用定时任务对快要失效的缓存进行更新缓存和失效时间

【参考链接:https://juejin.im/post/6844903813904596999】

相关文章

网友评论

      本文标题:缓存穿透、缓存击穿、缓存雪崩

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