一 什么是布隆过滤器

Bloom Filters - the mathBloom Filters - the mathhttps://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
维基百科https://zh.m.wikipedia.org/zh/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中

1.工作原理

当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点位(offset),把它们置为 1。
判断是否存在时,只要看这些点是不是都是 1。
如果这些点有任何一个 0,则被检元素一定不在;
如果都是 1,则被检元素很可能在。这就是布隆过滤器的基本思想。

2.优点

  • 空间占用小,相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。
  • 布隆过滤器存储空间和插入/查询时间都是常数 O(k) 。
  • 散列函数相互之间没有关系,方便由硬件并行实现。
  • 布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

3.缺点

  • 随着存入的元素数量增加,误算率随之增加
    例如元素a hash后的bit点位是 1,2,3; 元素b hash后bit点位也是1,2,3 ,然而b并不存在于布隆表中。
  • 元素无法删除

4.误判率推导

m 是该位数组的大小,k 是 Hash 函数的个数。

//todo

二 基于redis bitmap实现布隆过滤器

1.lua实现位bitmap操作, 保证整个操作的原子性

设置bloom 位

--ARGV:偏移量offset数组
--KYES[1]: setbit操作的key
--全部设置为1
for _, offset in ipairs(ARGV) doredis.call("setbit", KEYS[1], offset, 1)
end

读取

--ARGV:偏移量offset数组
--KYES[1]: getbit操作的key
--检查是否全部为1 ,全部为1 说明已经存在了
for _, offset in ipairs(ARGV) doif tonumber(redis.call("getbit", KEYS[1], offset)) == 0 thenreturn falseend
end
return true

2.代码实现

type redisBitSet struct {store *redis.Rediskey   string //redis keybits  uint //bloom表长度
}//检查bit位 是否是1 ,元素是否已经存在
func (r *redisBitSet) check(offsets []uint) (bool, error) {args, err := r.buildOffsetArgs(offsets)if err != nil {return false, err}resp, err := r.store.Eval(testScript, []string{r.key}, args)if err == redis.Nil {return false, nil} else if err != nil {return false, err}exists, ok := resp.(int64)if !ok {return false, nil}return exists == 1, nil
}//设置元素已经存在
func (r *redisBitSet) set(offsets []uint) error {args, err := r.buildOffsetArgs(offsets)if err != nil {return err}_, err = r.store.Eval(setScript, []string{r.key}, args)if err == redis.Nil {return nil}return err
}func (r *redisBitSet) buildOffsetArgs(offsets []uint) ([]string, error) {var args []stringfor _, offset := range offsets {if offset >= r.bits {return nil, ErrTooLargeOffset}args = append(args, strconv.FormatUint(uint64(offset), 10))}return args, nil
}

布隆过滤器原理与golang实现相关推荐

  1. 布隆过滤器原理和基于BloomFilter的误判率展示

    布隆过滤器 布隆过滤器原理 布隆过滤器是由n个Hash函数和一个二进制数组组成. 如图所示(参考,hash函数可以多个) 1.保存操作 发来一个请求数据hello 对数据hello经过三次hash运算 ...

  2. 布隆过滤器误判怎么办为什么会_五分钟小知识:布隆过滤器原理和应用分析

    布隆过滤器出现的背景和要解决的问题 Wikipedia 上面提到布隆过滤器早在 1970 年就被提出来,很难想象在当时那个年代它的主要用途是什么,估计当时提出也是一个数据模型吧. 在互联网时代,每天会 ...

  3. 布隆过滤器原理和使用

    LSM读放大问题背景 LSM树中读放大的来源是,我们必须寻址多个磁盘驻留表,以便完成读取操作.这是因为我们不一定能预先知道一个磁盘驻留表是否包含要搜索的键指向的数据记录. LSM使用bloomfilt ...

  4. 布隆过滤器原理深度剖析

    HBase布隆过滤器原理深度剖析 1. 数据结构与原理 1.1 初始化 1.2 变量映射 1.3 变量检索 1.4 总结 2. 过滤器特性 2.1 误判率 2.2 判断特点 3. 案列代码 1970年 ...

  5. 布隆过滤器原理及在推荐业务的应用

    提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里.有人说判断一个item是否在一个item列 ...

  6. C++ 布隆过滤器原理及实现

    概念 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都 ...

  7. 详解各种布隆过滤器原理及使用场景

    文章目录 1.什么是布隆过滤器? 2.布隆过滤器的原理介绍 3.布隆过滤器使用场景 4.通过 Java 编程手动实现布隆过滤器 5.利用Google开源的 Guava中自带的布隆过滤器 6.Redis ...

  8. 布隆过滤器原理(有眼睛就能看懂)

    作用嘛就是用来过滤非法key,避免缓存穿透(请求直接打到数据库),布隆过滤器底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大 先贴demo后BB public class M ...

  9. 布隆过滤器原理及实践

    1 背景 现在有海量的数据,而这些数据的大小已经远远超出了服务器的内存,现在再来一条数据,如何快速高效判断这条数据在不在其中? 如果这些数据是存在数据库中的,考虑索引,分库分表:或者考虑其他目前主流的 ...

最新文章

  1. 7大类卷积神经网络(CNN)创新综述
  2. SQLserver多条件查询
  3. 全面剖析C#正则表达式
  4. 《DSP using MATLAB》示例Example7.10
  5. Angular2 依赖注入
  6. C++传递数组给函数
  7. 计算机专业马来西亚,去马来西亚读计算机专业如何
  8. Ninth season eighth episode,Rachel‘s another sister,how is she???
  9. 计算机三维艺术设计基础,计算机艺术设计基础(修订版)
  10. hive hue 中文乱码的问题
  11. echarts tooltip属性加背景图片
  12. java中的boolean
  13. Windows 10源码一览!
  14. Object转成map对象
  15. MobileNet_ssd原理
  16. 驼峰转下划线下划线转驼峰
  17. vue实现点击星星评分效果
  18. salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解
  19. 王芷蕾、天韵诗班-给我换颗心(心灵不打烊)
  20. 班级综合评测数据管理系统

热门文章

  1. mysql w3scoll_jQuery滚动条插件 – jquery.slimscroll.js
  2. 专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?
  3. 贝思外贸软件-支持多种方式登录
  4. day7CSS3新特性
  5. Power bi 4.18 时间序列图
  6. Java:Collections.empty*的作用及要注意的地方
  7. VS2017 CUDA编程学习5:CUDA并行执行-线程
  8. UML建模系列-类图(Class diagram)
  9. 用计算机撩人套路,超甜撩人套路一问一答
  10. 怎么找到python的安装目录_怎么查看python的安装目录呢