美文网首页
解决缓存击穿的利器-布隆过滤器

解决缓存击穿的利器-布隆过滤器

作者: brightliming | 来源:发表于2018-05-11 14:59 被阅读0次

一。什么是缓存击穿

       在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

        在高并发的场景下,缓存相当于数据库的防火墙,如果用一个肯定不存在的key去访问系统,每次都会绕过缓存去访问数据库,缓存则失去了作用。

二。解决缓存击穿的一点思考

(1)解决方案一:将所有的可用的key放入缓存,hashtable中。

以一个圆通单号为例,一个圆通单号是32位的byte,圆通的订单量大概有50亿

32byte * 50 亿 ≈ 120G  

需要120G的内存,成本太高

(2)解决方案二:利用分布式存储,比如elasticsearch,不太优雅

三。解决缓存击穿的利器-bloomFilter

(1)什么是bloomFilter

        Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。

       Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就是Bloom Filter判断元素不再集合,那肯定不在。如果判断元素存在集合中,有一定的概率判断错误。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter比其他常见的算法(如hash,折半查找)极大节省了空间。 

图一

(2)这里有一个google guava包对布隆过滤器经典实现:

<pre>

import com.google.common.hash.BloomFilter;import com.google.common.hash.Funnels;import java.util.HashSet;import java.util.Random;public classtestBloomFilter{ static int sizeOfNumberSet = Integer.MAX_VALUE >> 4;

    static Random generator = new Random();

    public static void main(String[] args) {

        int error = 0;

        HashSet hashSet = new HashSet();

        BloomFilter filter = BloomFilter.create(Funnels.integerFunnel(), sizeOfNumberSet);

        for(int i = 0; i < sizeOfNumberSet; i++) {

            int number = generator.nextInt();

            if(filter.mightContain(number) != hashSet.contains(number)) {

                error++;

            }

            filter.put(number);

            hashSet.add(number);

        }

        System.out.println("Error count: " + error + ", error rate = " + String.format("%f", (float)error/(float)sizeOfNumberSet));

    }

}

</pre>

相关文章

  • 解决缓存击穿的利器-布隆过滤器

    一。什么是缓存击穿 在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后...

  • Redis布隆过滤器之初体验

    之前,小马在聊缓存击穿和穿透的文中有介绍过防止缓存穿透其中的一种方式是使用布隆过滤器,那什么是布隆过滤器呢?今天就...

  • PHP 操作 Redis bloomfilter 布隆过滤器

    redis 4.0 提供的布隆过滤器插件应用场景:过滤,防止缓存缓存击穿等等缺点:数据不精确,存在一定的误判率

  • 缓存穿透、缓存击穿、缓存雪崩、缓存热点原理及方案【通俗版】

    缓存穿透 缓存中不存在,穿透到DB解决方案: 采用布隆过滤器 空值写进缓存,设置短时间 缓存击穿 缓存过期,同时大...

  • 预防缓存击穿-布隆过滤器

    为什么使用布隆过滤器 布隆过滤器是用来判断一个元素是否出现在给定集合中的重要工具,具有快速,比哈希表更节省空间等优...

  • 布隆过滤器

    布隆过滤器起源 为什么我们要用布隆过滤器? 布隆过滤器是在海量数据找到想要的结果,经常应用于redis的缓存穿透(...

  • Redis总结

    一、数据类型 二、使用场景 二、redis缓存使用总结 三、redis缓存常见问题 四、布隆过滤器的方式解决缓存穿透问题

  • Guava - 布隆过滤器的使用

    布隆过滤器简单介绍 布隆过滤器介绍 maven引入 布隆过滤器的使用 参考及拓展 Guava的布隆过滤器 布隆过滤...

  • 没人告诉过你更复杂的缓存穿透怎么解决

    你应该从网上看过太多的文章说缓存穿透怎么解决?无非就是布隆过滤器,缓存空值什么的。 但是,更深入的一个问题,缓存空...

  • kata05:布隆过滤器

    这次kata的内容:实现一个布隆过滤器 布隆过滤器 (Bloom Filter) 什么是布隆过滤器呢?简单来说, ...

网友评论

      本文标题:解决缓存击穿的利器-布隆过滤器

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