什么是布隆过滤器?如何实现布隆过滤器?

什么是布隆过滤器?如何实现布隆过滤器?
最新回答
迷失了就不酷了

2023-02-26 15:58:47

布隆过滤器是一种空间效率极高的概率型数据结构,用于判断元素是否在集合中,存在一定误差率,即可能误判元素存在但实际不存在,但能确保元素不存在时一定判断正确。

  • 基本原理:基于位数组和多个哈希函数。位数组初始全为0,添加元素时,通过多个哈希函数计算元素对应位置,将这些位置设为1;查询时,检查元素经哈希函数计算的所有位置是否都为1,若都为1则可能存在,否则一定不存在。

  • 特点

    空间效率高:相比其他数据结构,能以较小空间存储大量元素信息。

    查询速度快:哈希计算和位数组检查操作简单,时间复杂度低。

    存在误差:可能将不存在的元素误判为存在,误差率可通过调整参数控制。

布隆过滤器的执行过程如下

  • 创建位数组:在Redis中创建一个位数组,用于存储布隆过滤器的位向量。
  • 初始化哈希函数:确定多个哈希函数,哈希函数数量影响误差率和空间利用率。
  • 添加元素:对元素进行多次哈希计算,将对应位数组位置设为1。
  • 查询元素:对元素进行多次哈希计算,检查对应位数组位置是否都为1。

布隆过滤器的使用场景如下

  • 大数据量去重:判断数据是否已存在,避免重复插入,如处理大量日志数据时去除重复记录。
  • 缓存穿透:过滤恶意请求或请求不存在的数据,防止频繁访问后端存储,如缓存系统用布隆过滤器判断请求数据是否在缓存中。
  • 网络爬虫的URL去重:判断URL是否已被爬取,避免重复爬取,提高爬虫效率。

在Redis中实现布隆过滤器的步骤如下

  • 打包RedisBloom插件

    克隆RedisBloom项目代码:

git clone
https://github.com/RedisLabsModules/redisbloom.git
  • 进入项目目录并编译:
cd redisbloommake
  • 编译成功后,根目录会生成redisbloom.so文件。

  • 启用RedisBloom插件

    重新启动Redis服务,指定加载redisbloom.so插件,命令如下:

redis-server redis.conf --loadmodule ./src/modules/RedisBloom-master/redisbloom.so
  • 创建布隆过滤器

    在Redis客户端中,使用BF.RESERVE命令创建布隆过滤器,设置名称、误差率和期望插入元素数量,示例如下:

BF.RESERVE my_bloom_filter 0.01 100000
  • 此命令创建名为my_bloom_filter的布隆过滤器,误差率为1%,期望插入100000个元素。

  • 添加元素到布隆过滤器

    使用BF.ADD命令添加元素,示例如下:

BF.ADD my_bloom_filter leige
  • 此命令将元素leige添加到my_bloom_filter布隆过滤器中。

  • 检查元素是否存在

    使用BF.EXISTS命令检查元素是否存在,示例如下:

BF.EXISTS my_bloom_filter leige
  • 若返回1,表示元素可能存在;若返回0,表示元素一定不存在。