硬核|Redis布隆(Bloom Filter)过滤器原理与实战

一、布隆过滤器原理

布隆过滤器是一种空间效率很高的随机数据结构,它利用位数组和哈希函数来判断一个元素是否存在于集合中。布隆过滤器最初由Burton Howard Bloom在1970年提出,主要用于在大规模数据中判断一个元素是否存在。

1.1 布隆过滤器基本原理

布隆过滤器基于一个位数组和若干个哈希函数,其中位数组是一个由0和1组成的数组,初始值全部为0。当一个元素加入到布隆过滤器中时,会通过多个哈希函数生成多个哈希值,然后将这些哈希值对应的位数组位置设置为1。当一个元素要查询是否存在于布隆过滤器中时,也会通过多个哈希函数生成多个哈希值,然后查询这些哈希值对应的位数组位置是否都为1。如果任何一个位数组位置不为1,那么该元素肯定不存在于布隆过滤器中。如果所有位数组位置都为1,那么该元素可能存在于布隆过滤器中。因为多个元素可能会被哈希到同一个位数组位置上,所以存在误判的情况,但是不会漏掉任何一个元素。



1.2 布隆过滤器优点

布隆过滤器相比其他数据结构有如下优点:

  • 空间效率高:布隆过滤器只需要一个位数组和若干个哈希函数,所以它的空间效率很高。
  • 查询效率高:布隆过滤器的查询效率非常高,因为它只需要对位数组进行查询,而不需要真正的查询数据。
  • 可扩展性强:布隆过滤器可以根据需要动态调整位数组大小。

1.3 布隆过滤器缺点

布隆过滤器相比其他数据结构有如下缺点:

  • 无法删除元素:因为布隆过滤器的位数组中只能将元素对应的位设置为1,不能设置为0,所以无法删除元素。
  • 存在误判率:由于布隆过滤器使用的是哈希函数,所以在处理大量数据时,误判率是无法避免的。即使增加哈希函数的数量和布隆过滤器的大小,误判率也无法完全消除。



二、Redis布隆过滤器实现

Redis提供了布隆过滤器的实现,可以通过Redis的命令进行操作。下面是Redis布隆过滤器常用命令:

2.1 BF.ADD

将元素添加到布隆过滤器中。

语法:

BF.ADD key element [element ...]

参数:

  • key:布隆过滤器的名称。
  • element:要添加的元素。

返回值:

  • 如果元素已经存在于布隆过滤器中,返回0。
  • 如果元素不存在于布隆过滤器中,将元素添加到布隆过滤器中并返回1。

示例:

BF.ADD myfilter foo
BF.ADD myfilter bar

2.2 BF.EXISTS

判断元素是否存在于布隆过滤器中。

语法:

BF.EXISTS key element

参数:

  • key:布隆过滤器的名称。
  • element:要查询的元素。

返回值:

  • 如果元素存在于布隆过滤器中,返回1。
  • 如果元素不存在于布隆过滤器中,返回0。

示例:

BF.EXISTS myfilter foo
BF.EXISTS myfilter baz

2.3 BF.MADD

将多个元素添加到布隆过滤器中。

语法:

BF.MADD key element [element ...]

参数:

  • key:布隆过滤器的名称。
  • element:要添加的元素。

返回值:

  • 返回一个数组,表示每个元素是否添加成功。如果元素已经存在于布隆过滤器中,返回0;如果元素不存在于布隆过滤器中,将元素添加到布隆过滤器中并返回1。

示例:

BF.MADD myfilter foo bar baz

2.4 BF.MEXISTS

判断多个元素是否存在于布隆过滤器中。

语法:

BF.MEXISTS key element [element ...]

参数:

  • key:布隆过滤器的名称。
  • element:要查询的元素。

返回值:

  • 返回一个数组,表示每个元素是否存在于布隆过滤器中。如果元素存在于布隆过滤器中,返回1;如果元素不存在于布隆过滤器中,返回0。

示例:

BF.MEXISTS myfilter foo bar baz

2.5 BF.INFO

获取布隆过滤器的信息。

语法:

BF.INFO key

参数:

  • key:布隆过滤器的名称。

返回值:

  • 返回布隆过滤器的信息,包括布隆过滤器的大小、哈希函数的个数和误判率等。

示例:

BF.INFO myfilter

相关文章

面试突击90:过滤器和拦截器有什么区别?

过滤器(Filter)和拦截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面编程)思想实现的,用来解决项目中某一类问题的两种“工具”,但二...

Springboot过滤器和拦截器详解及使用场景

一、过滤器和拦截器的区别1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。2、拦截器可...

聊聊Redis布隆过滤器(原理+实践篇)

1 Bloom Filter 介绍布隆过滤器(Bloom Filter)是 Redis 4.0 版本提供的新功能,我们一般将它当做插件加载到 Redis 服务器中,给 Redis 提供强大的去重功能。...

一种基于布隆过滤器的大表计算优化方法

问题背景在大数据行业内,尤其是数仓建设中,一直有一个绕不开的难题,就是大表的分析计算(这里的大表指亿级以上)。特别是大表之间的 Join 分析,对任何公司数据部门都是一个挑战!主要有以下挑战:由于数据...

Java Web—Filter(过滤器)

web中的过滤器的作用:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。web中过滤器的应用场景:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤...Filter...

JAVA:如何实现 Bloom 过滤器?它是做什么用的?

在处理大型数据集时,经常需要快速确定一个元素是否属于某个集合。虽然传统的数据结构如哈希表和树可以完成这项任务,但随着数据量的增加,它们对空间的需求也随之激增。Bloom过滤器提供了一种高度空间效率的概...