1 缓存穿透,DB压力增大
常用的k-v型缓存,当查询一个key而缓存中没有value时,就会去database中查询,如果恶意查询会导致db压力增大。
解决方法:
1.空对象
碰到查询结果为空的键,放一个空值在缓存中,下次再访问就立刻知道这个键无效,不会再访问DB。
空对象存在的问题:1.由于每个空k-v都会存在缓存中,所以空的查询越多,缓存需求越大,可以通过设置过期时间来解决这个问题。
2.因为设置了过期时间,当此时间段内再次查询缓存时,就会直接返回空值,而此时间段内DB数据更改了,数据就会不一致,可以用消息(kafka)来同步或者清除对应的缓存。
2.布隆过滤器
(具体见下篇)
去重过滤,把所有键值放到布隆过滤器中,布隆过滤器每个请求会返回“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,所以会过滤掉大部分空值的请求,只有少量的空值请求会穿透,减少了db的压力。
2 缓存雪崩
首先缓存失效,比如并发请求很多时,某一时间查询很多数据放到缓存并且设置了过期时间,当时间结束,缓存大片失效,后面的请求都会直接走向DB,一个简单的方法是均衡过期时间,使缓存失效的时间段平衡。
当缓存服务重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,后端系统(比如DB)带来很大压力。可以对线程加锁或者直接用队列查询DB,减小DB的压力,缺点的增加了处理时间。可以做缓存服务器的主备,主缓存雪崩后走备用服务器,涉及到数据的一致性问题。
网友评论