redis 布隆过滤器

https://www.one-tab.com/page/0bEKXW4PQC6yYTPmotOOnw

布隆过滤器

主要用于判断一个元素是否在一个集合中。假如某个数据集很大 ,比如说在 Mysql 中 ,数据量很大 ,即使加上了索引 ,大量的查询也会影响性能 (缺页,底层IO等)而布隆过滤器就是为了解决这种问题 ,

1297993-20220303154903544-1803702569.png

可以看到一个值通过多个 hash 函数在一个 bitmap 中进行 01赋值 .

查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合中有没有它了
- 如果这些点有任何一个 0,则被查询变量一定不在;
- 如果都是 1,则被查询变量很可能存在
为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散列函数是会有碰撞的。

详细的布隆过滤器原理见这篇文章

布隆过滤器特征

  • 一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在。
  • 布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

布隆过滤器实战

了解完布隆过滤器, 我们看一下实战章节, 有以下场景 :
有一批数据数量在 15w 左右 , 需要定时从外部同步回来筛选出有哪些数据是新增的, 哪些是更新的, 其中数据有两个字段一个 (noname字段) , 假设 15w 数据都去数据库一一比对 ,这个过程非常消耗时间 ,当允许少量误差率的情况下我们使用两个布隆过滤器

方案流程图

1297993-20220303174641482-2107846617.png

安装 redis布隆过滤器

  redis:
    image: redis:5
    container_name: redis
    command: redis-server /conf/redis.conf
    volumes:
      - ./mydata/redis/data:/data #数据文件挂载
      - ./mydata/redis/conf/redis.conf:/conf/redis.conf #配置文件挂载
      - ./mydata/redis/conf/sentinel.conf:/conf/sentinel.conf #配置文件挂载
      - ./mydata/redis/bloom/redisbloom.so:/data/redisbloom.so #加载布隆过滤器
      - ./mydata/redis/bloom/bankcspn.lua:/data/bankcspn.lua #数据插入过滤器lua脚本
    ports:
      - 6379:6379

bankcspn.lua 脚本的内容如下 , 主要的操作是是创建一个名字叫bankCspn 的布隆过滤器 ,并往里面添加值

local key ='bankCspn'
redis.call("BF.RESERVE" , key,"0.00001", "160000")
redis.call("BF.ADD" , key,"000132800023")
redis.call("BF.ADD" , key,"000998800006")
redis.call("BF.ADD" , key,"001100011002")
redis.call("BF.ADD" , key,"001110012009")
redis.call("BF.ADD" , key,"001110012017")
redis.call("BF.ADD" , key,"001121013007")
redis.call("BF.ADD" , key,"001121013015")
redis.call("BF.ADD" , key,"001121013023")
redis.call("BF.ADD" , key,"001121013031")
redis.call("BF.ADD" , key,"001121013040")
redis.call("BF.ADD" , key,"001121013058")
redis.call("BF.ADD" , key,"001121013066")
redis.call("BF.ADD" , key,"001121013074")
redis.call("BF.ADD" , key,"001121013082")
redis.call("BF.ADD" , key,"001121013099")
.....

创建完了之后长这个样子 :
1297993-20220303175848598-1620578526.png

后续就是代码编程的工作了. 一个简单的实战就完成了.

参考资料

posted @ 2022-03-03 22:57  float123  阅读(386)  评论(0编辑  收藏  举报