• 布(隆/谷鸟)过滤器


    布隆过滤器

    本质:一个空的2进制数组(初始全为0,只存0和1)

    插入

    一个key,经过k个hash函数运算后,得到k个值,将2进制数组对应下标的位置置为1。

    查询

    将key同样进行k个hash,去2进制数组比对对应下标位置的值

    • 全为1则可能存在该key;
    • 不全为1,则一定不存在该key

    删除

    不能删

    应用

    • 大集合中检查元素是否重复
    • Redis中防止缓存穿透

    缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。
    解决办法:将数据源的key是否存在的信息存储到布隆过滤器中,如果布隆过滤器判定数据不存在,则不再请求数据源。

    布谷鸟过滤器

    基本的布谷鸟过滤器由两个并不独立的哈希函数构成。
    基本单位为条目,每个条目存储一个指纹。
    指纹指的是使用一个哈希函数生成的n位比特位,n的具体大小由所能接受的误判率来设置。一般n=8
    布谷鸟哈希表由一个桶数组构成,每个桶可以有多个条目,即每个桶中有多个存放指纹的位置。

    插入

    先进行一次hash,得出应当插入位置和应当插入的值(指纹)。
    如果这个桶(桶内的m个位置均被占用)插入失败,会重新计算(指纹哈希与第一个索引异或),查看第二个桶能否插入。

    若第二个桶插入失败,则会随机在两个桶中挑选一个桶,将其中的一个值标记为旧值,用新值覆盖旧值,旧值会在重复上面的步骤进行插入。

    扩容

    如果数组过小,会发生循环挤兑的情况。
    如果超过最大挤兑次数,进行扩容,重新计算每个指纹的位置。

    删除

    • 通过两次hash找到索引位置,如果任何桶中的指纹匹配,则从该桶中删除匹配指纹的一份副本。
    • 如果俩数据的哈希值和指纹相同时,会出现误删除情况。
    更新

    删除后再添加新指纹。

    优点

    • 支持删除
    • 在误判率小于3%时,空间性能优于布隆过滤器
    • 查询效率高

    缺点

    • 插入性能差
    • 插入重复元素存在上限(哈希函数个数*桶容量)
    • 空间大小要求是2的指数
    • 删除有问题,存在误删的概率

    表格一览

    布隆过滤器布谷鸟过滤器
    插入k个hash函数2个hash函数
    删除不能删可以删
    更新不能更新删除后再添加
    查询有误判率有误判率
    优点安全、节省空间查询效率高、支持删除、更节省空间
    缺点有误判率、无法删除插入性能差、插入重复元素有上限、空间大小为2的指数、删除不完美
  • 相关阅读:
    Linux系统 Nginx服务器集群配置
    Vue 拖拽功能 之 自定义指令实现元素拖拽功能
    Golang当中的定时器
    区块链行业的发展,业已进入到一个全新的发展阶段
    怎么找回删除录音?音频恢复,3个方法找回
    基本算法——冒泡排序(Python版)
    湖北绝缘监测仪矿业煤炭石油金矿玉矿铁矿铜矿矿井钢厂
    如何构建Hive数据仓库Hive 、数据仓库的存储方式 以及hive数据的导入导出
    日期调度器:dbi-tech Solutions Schedule .NET v7
    wordpress数据库迁移Invalid default value for ‘comment_date‘
  • 原文地址:https://blog.csdn.net/weixin_44783387/article/details/127893795