目录前言缓存穿透、击穿、雪崩缓存穿透出现情况常见的解决方案缓存击穿出现情况解决方案缓存雪崩解决方案布隆过滤器 Bloom filter总结前言 随着我们业务开发越来越来大,并染请求
随着我们业务开发越来越来大,并染请求就会越来越多,那么我们的项目的压力就会越来越大,基本都会使用缓存,除本地缓存,还会用到Redis缓存,但是你以为使用缓存就没啥问题了么,那肯定不是的,使用了缓存又会出现新的问题,比如,缓存的key失效导致大量的请求到数据库,大量的读请求瞬间到达了数据库,cpu的使用率爆增,导致数据库都可能挂掉,这种情况下我们就要考虑使用redis的布隆过滤器了。
首先我们从缓存会出现的几种问题,来进行分析,在高并发的场景下如果出现这种情况,我们应该如何解决。
正常情况下,我们的WEB应用会先去请求缓存服务,如果缓存命中,那么就去拿缓存里面的数据,返回结果给应用,
缓存穿透与缓存雪崩和缓存击穿还是不一样的,雪崩和击穿的情况下,数据库的数据都是真正常的,可以去请求数据库获取数据,只是缓存层出现问题,等待缓存恢复了,就会减轻数据库的压力。 而缓存透不一样的就是,缓存和数据库都没有要请求的数据,大量的请求来了,数据库的压力很大。
前面提到过布隆过滤器在请求比较高的时候,可以帮助我们抵挡一部分请求,从而减轻数据库的压力,布隆过滤器的数据结构是一个二进制的bit向量,或者说是一个bit数组,它相对于list、set、map这些集合,它占用的空间更少,不足之处处就是返回的结果会有一定概率的误差。
public static void main(String[] args) {
int size = 1_000_000;
BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size);
for (int i = 0; i < size; i++) {
bloomFilter.put(i);
}
for (int i = 0; i < size; i++) {
if (!bloomFilter.mightContain(i)) {
System.out.println("有漏网之鱼");
}
}
List<Integer> list = new ArrayList<>(1000);
for (int i = size + 10000; i < size + 20000; i++) {
if (bloomFilter.mightContain(i)) {
list.add(i);
}
}
System.out.println("有误差的数量:" + list.size());
}
确实有误差的数量,但是误差量不大,追求效率的同时只是牺牲一点误差了。
加锁的排队的场景确实能帮助我们很好的解决缓存穿透、击穿的一些问题,但是效率也是非常低了,因为每个请求都是排队等待,如果可以接受轻微误差的话,布隆过滤器的确是个很不错的选择,Bloom filter的bitmap的存储效率确实很高。
以上就是Redis处理高并发之布隆过滤器详解的详细内容,更多关于Redis布隆过滤器处理高并发的资料请关注编程网其它相关文章!
--结束END--
本文标题: Redis处理高并发之布隆过滤器详解
本文链接: https://www.lsjlt.com/news/176222.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0