Redis布隆过滤器

109 阅读2分钟

布隆过滤器介绍

布隆过滤器:是一种 space efficient 的概率型数据结构,用于判断一个元素是否在集合中

布隆过滤器的特点:不存在的一定不存在,存在的不一定存在

当布隆过滤器说,某个数据存在时,这个数据可能不存在; 当布隆过滤器说,某个数据不存在时,那么这个数据一定不存在。

优点:

  1. 节省空间:布隆过滤器只需要哈希表的 1/8 或 1/4 的空间复杂度解决判断数据是否存在的问题;
  2. 不存在漏报问题。

缺点:

  1. 布隆过滤器可以插入元素,但不可以删除已有元素
  2. 存在误报现象:数据越多,误报率越大。

布隆过滤器原理

布隆过滤器的基本思想

添加元素时,通过K个散列函数将这个元素映射成一个位数组中的K个点(有效降低冲突概率),把它们置为1。

检索时,只需要判断数据散列后对应的位置上的值是否都为1:

  1. 如果这些点有任何一个为0,则被检数据一定不存在;
  2. 如果都是1,则被检元素很可能在。

image-20240131134447225.png

为什么会出现误判?

原因:哈希函数会出现碰撞,所以布隆过滤器会存在误判。

解释:集合中存的数据是经过 Hash 之后的值,即存的是 key 的 Hash 值,而非 key 的值。所以有概率存在这样的 key:它们内容不同,但多次 Hash 后的 Hash 值都相同。也就是hash出来的是1的位置上可能是其他的值

为什么不存在漏报?

对于布隆过滤器判断不存在的 key ,则是 100% 不存在的

反证法:如果这个 key 存在,那它每次 Hash 后对应的 Hash 值位置肯定是 1,而不会是 0,布隆过滤器判断存在不一定真的存在

为什么不允许删除元素?

删除意味着需要将对应的 k 个 bits 位置设置为 0,其中有可能是其他元素对应的位。因此删除会引入误判,这是绝对不被允许的

布隆过滤器涉及的计算

image-20240306134206419.png

  • n 是过滤器预期支持的元素个数;
  • m是过滤器位数组的大小,即该过滤器总共占用多少 bit 的空间;
  • c是每个元素平均占用的空间;
  • p是假阳性概率,即 fpp (false positive probability);
  • k哈希函数的个数;

通常创建一个布隆过滤器,会需要用户提供想支持的 n 和预期的 p, 然后通过公式得到其余最佳的参数。