布隆过滤器
基本概念
布隆过滤器(英语: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