LiSheng's blog LiSheng's blog
首页
笔记
个人简历
随笔集
GitHub (opens new window)
首页
笔记
个人简历
随笔集
GitHub (opens new window)
  • golang

  • cplus

  • leetcode

  • 存储技术

  • 分布式系统

  • 计算机网络

  • Linux操作系统

  • Redis

    • 大纲
    • redis持久化策略
    • redis事务
    • redis分布式锁
    • redis高可用
    • redis主从同步
    • Redis是什么
    • Redis基本数据结构
    • Redis为什么这么快
    • 缓存击穿、缓存穿透、缓存雪崩
    • 热Key问题,如何解决热key问题
    • Redis 过期策略和内存淘汰策略
    • Redis 的持久化机制
    • Redis的高可用
    • 使用过Redis分布式锁
    • Redis的跳跃表
    • MySQL与Redis 如何保证双写一致性
    • Redis的Hash 冲突怎么办
    • 布隆过滤器
      • Redis 事务机制
    • 其他

    • 笔记
    • Redis
    lisheng
    2024-09-10
    目录

    布隆过滤器

    布隆过滤器(Bloom Filter)是一种用于集合查询的概率型数据结构,主要用于判断一个元素是否属于集合。它能够以非常小的空间来表示一个集合,并且能快速判断一个元素是否在集合中,但它允许有一定的错误率(即可能存在“假阳性”,即返回元素在集合中,但实际上不在集合中)。

    # 布隆过滤器的结构

    • 位数组(Bit Array): 布隆过滤器的核心是一个长度为 m 的位数组,每一位初始时都被设置为 0。
    • 哈希函数集合: 布隆过滤器使用 k 个独立的哈希函数,每个哈希函数将输入映射为位数组的一个索引位置。

    # 布隆过滤器的操作

    # 1. 添加元素

    当添加一个元素到布隆过滤器时,元素会经过 k 个哈希函数计算,得到 k 个数组索引。然后,将位数组中这些索引位置的值设为 1。

    步骤:

    1. 将元素通过 k 个哈希函数计算出 k 个哈希值。
    2. 根据哈希值,将位数组对应位置的位设置为 1。

    # 2. 查询元素

    查询某个元素是否在布隆过滤器中时,同样将元素通过 k 个哈希函数计算出 k 个哈希值。如果位数组中所有这些索引位置的值都为 1,则认为该元素可能在集合中;如果任一位置为 0,则该元素一定不在集合中。

    步骤:

    1. 将元素通过 k 个哈希函数计算出 k 个哈希值。
    2. 检查位数组中对应索引位置的值是否都为 1。
    3. 如果全部为 1,则返回“可能存在”;如果有一个为 0,则返回“一定不存在”。

    # 布隆过滤器的特点

    • 空间效率高: 布隆过滤器使用较少的空间就能表示较大的集合,这对于存储大量数据或进行大规模集合操作非常有用。
    • 查询速度快: 由于仅需要进行 k 次哈希计算和位数组的查找,查询操作非常快速。
    • 假阳性(False Positive): 布隆过滤器可能会误判某个元素存在(即返回“可能存在”),但不会误判某个不存在的元素(即不会返回“一定存在”而实际不存在)。
    • 不可删除元素: 传统的布隆过滤器不支持删除操作,因为删除可能会影响其他元素的存在判断(除非使用带计数的布隆过滤器)。

    # 布隆过滤器的应用场景

    1. 网页爬虫的 URL 去重: 爬虫在抓取网页时需要快速判断某个 URL 是否已经被抓取过,可以使用布隆过滤器来进行快速判断。
    2. 数据库的缓存: 在数据库查询中,布隆过滤器可以用于判断某个键是否存在于数据库中,如果布隆过滤器返回不存在,则可以避免数据库的查询操作,减少查询开销。
    3. 垃圾邮件过滤: 布隆过滤器可以用于快速判断某个电子邮件是否为已知垃圾邮件。
    4. 区块链网络: 在比特币等区块链系统中,布隆过滤器被用来优化节点间的数据同步和查询过程。

    # 布隆过滤器的优缺点

    优点:

    • 高效空间利用: 能以较小的空间表示较大的集合。
    • 快速查询: 可以在常数时间内判断元素是否存在。

    缺点:

    • 假阳性率: 允许一定的误判,即可能会认为不存在的元素存在。
    • 不可删除: 传统布隆过滤器不支持删除元素。
    • 哈希函数的选择: 需要选择合适的哈希函数以确保较低的冲突率。

    # 扩展:计数布隆过滤器(Counting Bloom Filter)

    为了支持元素的删除操作,可以使用计数布隆过滤器(Counting Bloom Filter)。它的原理是在位数组的每个位置上存储一个计数器,而不是一个二进制位。添加元素时,相应的计数器递增;删除元素时,计数器递减。如果计数器变为 0,表示该位置不再有任何元素。

    # 总结

    布隆过滤器是一种高效的概率型数据结构,适用于大规模数据集中的快速存在性查询。虽然允许一定的假阳性,但其低空间开销和高查询效率使得它在很多场景中得到广泛应用。

    编辑 (opens new window)
    上次更新: 2024/09/13, 11:59:12
    Redis的Hash 冲突怎么办
    Redis 事务机制

    ← Redis的Hash 冲突怎么办 Redis 事务机制→

    最近更新
    01
    ceph分布式存储-对象存储(RGW)搭建
    10-27
    02
    ceph分布式存储-集群客户端连接
    10-27
    03
    ceph分布式存储-管理crushmap
    10-27
    更多文章>
    Theme by Vdoing
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式