首页 > 数据库 >一文彻底弄清Redis的布隆过滤器

一文彻底弄清Redis的布隆过滤器

时间:2024-10-21 12:58:33浏览次数:1  
标签:元素 数组 误判 Redis 布隆 哈希 过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的数据结构,用于快速判断一个元素是否在集合中。它能够节省大量内存,但它有一个特点:可能存在误判,即可能会认为某个元素存在于集合中,但实际上不存在;而对于不存在的元素,它保证一定不会误判。布隆过滤器适合在对存储空间要求极为严格,同时能接受少量误判的应用场景中使用。

1. 布隆过滤器的工作原理

布隆过滤器的核心思想是使用多个哈希函数(Hash Functions)和一个位数组(Bit Array)。其操作过程如下:

1.1 插入元素

  • 当插入一个元素时,布隆过滤器会使用多个不同的哈希函数对该元素进行哈希计算,得到多个哈希值(位置索引),并将这些哈希值对应的位数组位置设置为 1
  • 例如,一个元素经过 3 个哈希函数后,得到了 3 个不同的位置,布隆过滤器就在这 3 个位置上将位数组的值设为 1

1.2 查询元素

  • 查询某个元素时,布隆过滤器会使用相同的哈希函数对该元素进行哈希计算,得到多个位置。如果所有这些位置的位都为 1,则布隆过滤器认为这个元素可能存在;如果任意一个位置的位为 0,则可以确定这个元素一定不存在

1.3 特点

  • 可能存在误判:布隆过滤器有可能出现误判,查询一个不存在的元素时,有小概率会因为位数组中的某些位被其他元素设为 1,而误认为这个元素存在。
  • 不会漏判:如果某个元素不存在,布隆过滤器一定不会误判其存在,即布隆过滤器查询某个元素是否存在时,若判断不存在,结果是可靠的。

2. 布隆过滤器的组成部分

2.1 位数组(Bit Array)

位数组是布隆过滤器的核心数据结构。它是一个长度为 m 的数组,每个位置上只能存储 01。初始时,位数组中所有位置的值都为 0。在插入元素时,哈希函数根据元素值生成若干个位置索引,并将这些索引对应的位设为 1

2.2 哈希函数(Hash Functions)

布隆过滤器使用多个哈希函数(通常是独立的哈希函数)来对元素进行哈希操作。每个哈希函数会生成一个不同的位数组索引,用于确定元素的存储位置。

  • 选择的哈希函数应当具有较好的均匀性,确保哈希值能够均匀分布在位数组上,减少冲突。

2.3 哈希函数的数量(k 值)

k 表示用于每个元素的哈希函数的个数。哈希函数数量越多,误判的概率越低,但查询和插入的复杂度会增加。因此,k 的数量一般选择一个合适的中间值,以在查询性能和误判率之间取得平衡。

2.4 位数组的长度(m 值)

m 是位数组的长度,位数组越长,误判率越低,但需要占用的内存也更多。因此,位数组的长度应该根据实际的业务需求和内存开销进行权衡设计。

3. 布隆过滤器的误判率

布隆过滤器的误判率是指在查询时,布隆过滤器错误地认为一个不存在的元素存在于集合中的概率。误判率随着集合中插入的元素数量的增加而增加,主要受到以下几个因素的影响:

  • 位数组长度(m):位数组越长,误判率越低。
  • 哈希函数数量(k):哈希函数数量适中时误判率最低,但数量过多会使得误判率增加。
  • 元素数量(n):插入的元素越多,误判率越高,因为位数组中被设置为 1 的位越来越多,哈希函数的碰撞机会增大。

布隆过滤器的误判率计算公式如下: p=(1−e−k⋅nm)kp = \left( 1 - e^{- \frac{k \cdot n}{m}} \right)^kp=(1−e−mk⋅n)k

  • p 是误判率;
  • k 是哈希函数的数量;
  • n 是插入的元素数量;
  • m 是位数组的长度。

4. 布隆过滤器的优缺点

4.1 优点

  • 高效的空间利用率:布隆过滤器可以用较小的空间存储大量数据,尤其在元素数量很大时,它可以显著节省内存。
  • 查询和插入操作的时间复杂度很低:无论插入还是查询,布隆过滤器的时间复杂度都是 O(k),即与哈希函数的数量成线性关系,速度非常快。
  • 适合大规模数据过滤:对于海量数据的存在性判断,布隆过滤器非常高效,适合在需要快速判断某个元素是否存在的场景中使用。

4.2 缺点

  • 存在误判:布隆过滤器可能会误判一个元素存在,即判断结果可能为“假阳性”(False Positive),这意味着虽然布隆过滤器认为某个元素存在,但实际上它并不存在。布隆过滤器不适合用于需要精准判断的场景。
  • 无法删除元素:布隆过滤器无法直接删除元素,因为哈希函数将多个元素映射到同一位数组位置,删除某个元素可能会导致其他元素的哈希结果失效。虽然有计数布隆过滤器(Counting Bloom Filter)可以支持删除操作,但其实现更加复杂。

5. 布隆过滤器的典型应用场景

5.1 缓存穿透防护

  • 布隆过滤器最常见的应用之一就是防止

    缓存穿透

    。在 Redis 缓存场景中,用户请求的数据可能在缓存和数据库中都不存在,如果不加以防护,这些请求会直接打到数据库。通过布隆过滤器,可以在请求前判断元素是否可能存在于数据库中,从而减少无效的数据库查询。

    • 场景: 一个电商系统中,用户可能会频繁查询一些并不存在的商品 ID。布隆过滤器可以用来存储所有合法商品 ID,在查询前进行判断,如果布隆过滤器中不存在,则可以直接返回空结果,而不必查询数据库和缓存。

5.2 垃圾邮件过滤

  • 布隆过滤器可以用于垃圾邮件系统,用来快速判断某个电子邮件地址或 IP 是否在黑名单列表中。由于布隆过滤器的高效性,可以极大提高垃圾邮件检测的速度,并节省内存资源。

5.3 大数据去重

  • 在大规模数据处理场景中,布隆过滤器可以用来检测某个元素是否已经出现过,从而实现去重操作。它特别适用于对内存要求严格的系统中,比如分布式爬虫系统中需要去重的 URL 处理。

5.4 数据库和存储系统

  • 布隆过滤器被广泛应用于数据库和存储系统中,用于减少不必要的磁盘 I/O 操作。例如:
    • HBase 使用布隆过滤器来加快查找速度,避免不必要的磁盘读取。
    • Cassandra 使用布隆过滤器来判断某个 SSTable 是否包含某个键,从而减少磁盘扫描次数。

6. 布隆过滤器的扩展

6.1 计数布隆过滤器(Counting Bloom Filter)

计数布隆过滤器是一种支持删除操作的布隆过滤器。与标准布隆过滤器不同的是,计数布隆过滤器的位数组中的每个位置不再是二进制的 01,而是一个计数器。当插入一个元素时,多个哈希函数对应的位上的计数器增加;当删除一个元素时,计数器相应减少。

计数布隆过滤器的缺点是需要更多的存储空间(因为每个位置是一个计数器),但它允许删除元素,这使得它适用于动态更新的场景。

6.2 分布式布隆过滤器

在大规模分布式系统中,布隆过滤器可以扩展为分布式布隆过滤器,即将位数组分布在多个节点上,并且每个节点负责一部分位数组的存储和哈希计算。这样可以提高系统的可扩展性,适应更大规模的数据集。

总结

布隆过滤器是一种空间效率极高的数据结构,适用于需要快速判断某个元素是否存在的场景,尤其适用于防止缓存穿透、垃圾邮件过滤、大数据去重等场景。虽然它存在一定的误判率,但其出色的空间效率和查询性能使其成为许多大规模应用中的重要工具。

标签:元素,数组,误判,Redis,布隆,哈希,过滤器
From: https://www.cnblogs.com/lgx211/p/18489237

相关文章

  • redis 锁的5个大坑,如何规避?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • Bitmap 和 布隆过滤器傻傻分不清?你这不应该啊
    大家好,我是小富~有个兄弟私下跟我说,他在面试狗东时,有一道面试题没回答上来:Redis的Bitmap和布隆过滤器啥区别与关系?其实就是考小老弟对这两种工具的底层数据结构是否了解,不算太难的题。不过,bitmap和布隆过滤器在大数据量和高并发业务的使用频率不低,知识点应该掌握下,既然问了那咱......
  • RockyLinux安装redis
    本文介绍RockyLinux使用dnf在线安装redis并修改密码设置远程登陆。本博客使用RetHat系的新版本系统,如使用Debian系的系统如Ubuntu,只需使用apt安装,其余部分类似。1、使用如下命令安装redissudodnfinstallredis-server2、安装完成后可以使用systemctl工具对redis服务进行控......
  • 滚雪球学Redis[9.1讲]:Redis常见问题排查指南:解决错误、优化性能与确保数据一致性
    全文目录:......
  • 滚雪球学Redis[8.2讲]:Redis的未来发展趋势:从云服务到AI与物联网的前沿探索
    全文目录:......
  • 九、Redis之流水线
    Redis是一个使用客户端-服务器模型和所谓的请求/响应协议的TCP服务器。这意味着通常通过以下步骤完成请求:客户端向服务器发送查询,并通常以阻塞方式从套接字读取服务器响应。服务器处理命令并将响应发送回客户端。客户端发送请求到服务器,服务器处理请求并响应给客户端。这个......
  • Redis学习之Redis持久化
    一、简介       Redis的持久化是指将Redis内存中的数据保存到磁盘上,以确保在服务器停机或发生故障时,数据不会丢失。Redis提供了多种持久化机制,可以根据具体的应用场景和需求来选择合适的方式。Redis提供了2种不同形式的持久化方式:RDB(RedisDataBase):将当前数据状......
  • 一篇文章弄懂Redission可重入、重试锁以及MultiLock原理
    Redisson的可重入锁(ReentrantLock)是基于Redis实现的分布式锁,用于在分布式系统中提供线程安全的锁机制。它允许同一个线程在不释放锁的情况下多次获得锁,并在所有锁操作完成后,锁才真正被释放。下面我们来详细解析Redisson可重入锁的原理。基本原理可重入锁的核心思想是,同一线......
  • Redis相关面试题
    Redis为什么快?1.纯内存KV操作Redis的操作都是基于内存的,CPU不是Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常......
  • 记录Redis+MQ延迟双删保证缓存一致性
    场景描述在博客系统中,用户可以给博客点赞或者评论,这些操作需要更新数据库中的数据,同时要保证缓存中的博客信息与数据库保持一致。为了提高性能,博客数据会存放在Redis缓存中。但当有大量用户同事点赞或是评论时,缓存和数据库中的数据可能出现不一致。何谓延迟双删?延迟双删......