本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询。
作用:判断 “某样东西一定不存在或者可能存在”

典型应用

  • 数据库防止穿库。 Google Bigtable,HBase 和 Cassandra 以及 Postgresql 使用BloomFilter来减少不存在的行或列的磁盘查找。避免代价高昂的磁盘查找会大大提高数据库查询操作的性能。
  • 业务场景中判断用户是否阅读过某视频或文章,比如抖音或头条,当然会导致一定的误判,但不会让用户看到重复的内容。
  • 缓存宕机、缓存击穿场景,一般判断用户是否在缓存中,如果在则直接返回结果,不在则查询db,如果来一波冷数据,会导致缓存大量击穿,造成雪崩效应,这时候可以用布隆过滤器当缓存的索引,只有在布隆过滤器中,才去查询缓存,如果没查询到,则穿透到db。如果不在布隆器中,则直接返回。
  • WEB拦截器,如果相同请求则拦截,防止重复被攻击。用户第一次请求,将请求参数放入布隆过滤器中,当第二次请求时,先判断请求参数是否被布隆过滤器命中。可以提高缓存命中率。Squid 网页代理缓存服务器在 cache digests 中就使用了布隆过滤器。Google Chrome浏览器使用了布隆过滤器加速安全浏览服务
  • Venti 文档存储系统也采用布隆过滤器来检测先前存储的数据。
  • SPIN 模型检测器也使用布隆过滤器在大规模验证问题时跟踪可达状态空间。

布隆过滤器的实现

Java的实现

Redis的实现

redis的布隆过滤器以插件的形式安装
可下载源码编译安装

  1. git clone https://github.com/RedisBloom/RedisBloom.git
  2. cd RedisBloom
  3. make #编译 会生成一个rebloom.so文件
  4. redis-server --loadmodule /path/to/rebloom.so #运行redis时加载布隆过滤器模块
  5. redis-cli # 启动连接容器中的 redis 客户端验证

可使用docker安装

docker pull redislabs/rebloom:latest # 拉取镜像
docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest #运行容器
docker exec -it redis-redisbloom bash
redis-cli

常用命令
bf.add 添加元素到布隆过滤器
bf.exists 判断元素是否在布隆过滤器
bf.madd 添加多个元素到布隆过滤器,bf.add 只能添加一个
bf.mexists 判断多个元素是否在布隆过滤器

127.0.0.1:6379> bf.add mybl tian
(integer) 1
127.0.0.1:6379> bf.exists mybl sky
(integer) 1
127.0.0.1:6379> bf.madd mybl tom jerry
1) (integer) 0
2) (integer) 1
127.0.0.1:6379> bf.mexists mybl tom jerry
1) (integer) 1
2) (integer) 1

https://juejin.cn/post/6875872519103102989

一致性哈希算法及Java实现:https://blog.csdn.net/suifeng629/article/details/81567777