布隆过滤器(Bloom Filter)是一个 probabilistic data structure,用于判断一个元素是否在集合中。它通过使用多个哈希函数和位数组来提高查询效率。
布隆过滤器在Redis中应用最广泛,用于解决缓存击穿、缓存穿透等问题。
常用的布隆过滤器的实现是redission的bloomfilter。
1 | BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000000, 0.01); |
当一个元素被加入集合时,通过多个hash函数将这个元素映射成一个位数组中的多个点(offset)并把它们置为 1。检索时,我们只要看看这些点是不是都是1就知道集合中有没有它了:如果这些点有任何一个为0,则被检元素一定不存在;如果都是1,则被检元素很可能存在;所以存在误判的可能性;
如果想要降级误判,可以增加多个hash函数和多个位数组,这样hash函数的冲突会变大,但是误判的概率会降低。