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

缓存穿透/缓存击穿/缓存雪崩

作者: Richalll | 来源:发表于2022-02-22 14:12 被阅读0次

    1、缓存穿透

    访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

    解决方案

    (1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;

    (2)拦截器,id<=0的直接拦截。

    (3)从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。

    (4)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

    (5)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

    2、缓存击穿

    一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

    解决方案

    (1)设置热点数据永远不过期。

    (2)加互斥锁。

    3、缓存雪崩

    大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

    解决方案

    (1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

    (2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。

    (3)设置热点数据永远不过期。

    (4)使用互斥锁,但是该方案吞吐量明显下降了。

    (5)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点:

    从缓存A读数据,有则直接返回

    A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。

    更新线程同时更新缓存A和缓存B。

    相关文章

      网友评论

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

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