美文网首页
缓存穿透

缓存穿透

作者: doterlm | 来源:发表于2017-10-10 11:36 被阅读0次

1  缓存穿透,DB压力增大

    常用的k-v型缓存,当查询一个key而缓存中没有value时,就会去database中查询,如果恶意查询会导致db压力增大。

    解决方法:

   1.空对象

      碰到查询结果为空的键,放一个空值在缓存中,下次再访问就立刻知道这个键无效,不会再访问DB。

      空对象存在的问题:1.由于每个空k-v都会存在缓存中,所以空的查询越多,缓存需求越大,可以通过设置过期时间来解决这个问题。

                                       2.因为设置了过期时间,当此时间段内再次查询缓存时,就会直接返回空值,而此时间段内DB数据更改了,数据就会不一致,可以用消息(kafka)来同步或者清除对应的缓存。

   2.布隆过滤器

     (具体见下篇)

      去重过滤,把所有键值放到布隆过滤器中,布隆过滤器每个请求会返回“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,所以会过滤掉大部分空值的请求,只有少量的空值请求会穿透,减少了db的压力。

2  缓存雪崩

首先缓存失效,比如并发请求很多时,某一时间查询很多数据放到缓存并且设置了过期时间,当时间结束,缓存大片失效,后面的请求都会直接走向DB,一个简单的方法是均衡过期时间,使缓存失效的时间段平衡。

当缓存服务重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,后端系统(比如DB)带来很大压力。可以对线程加锁或者直接用队列查询DB,减小DB的压力,缺点的增加了处理时间。可以做缓存服务器的主备,主缓存雪崩后走备用服务器,涉及到数据的一致性问题。

相关文章

网友评论

      本文标题:缓存穿透

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