布隆过滤器

基本概念

布隆过滤器(英语:Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率查询时间远远超过一般的算法,缺点是有一定的误识别率和删除困难。

布隆过滤器的原理:当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检元素一定不在;如果都是 1,则被检元素很可能在

简单来说就是准备一个长度为 m 的位数组并初始化所有元素为 0,用 k 个散列函数对元素进行 k 次散列运算跟 len (m) 取余得到 k 个位置并将 m 中对应位置设置为 1。

优点

  • 存储空间和插入/查询时间都是常数(O(k));
  • 散列函数直接没有关系,可以由硬件并行实现;
  • 不需要要存储元素本身的数据,保密场合有优势

缺点

  • 随着存入元素量的增加,误算率随之增加;

用途

  • 限流,将不在服务范围内的请求排除在外;
  • 防止内存穿透;

Redis Sorted sets 注意事项

在使用sorted sets时,不能和其它业务混在一起,因为Redis是单线程,排序会造成类似于STW(Stop The World)的效果;

参考文档

[1] 品味布隆过滤器的设计之美

[2] 布隆过滤器 wiki