参考文章
布隆过滤器redis缓存
https://www.cnblogs.com/zhanggguoqi/p/10571225.html
布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法
借助Redis Bitmap实现简单的布隆过滤器
https://www.jianshu.com/p/c2defe549b40
bloom filter 布隆过滤器介绍
作用:判断一个元素是否在集合中。
异点:和java中的collection中的contain有很大的不同,
java中一般都是会,先把元素存储起来,但是布隆过滤器不用存储元素
原理:每个元素,通过k中不同的hash算法,计算出k个不同的index,把这个index存储位置都设置为1,
(二进制序列的index)
如果一个一个元素计算出所有index上都为1,则存在;一遇到index为0的,元素就不存在。
感觉:有点好玩,有点不可思议,有点不相信。
特点:判断不存在的,肯定不存在;判断存在的,可能是误判。
(为什么会误判呢?参考文章中说,二进制序列中1越来越多的时候,就会把不存在的元素,判断成存在)
(那么,我觉得是不是可以,定时重新更新序列呢!从而减少误判情况)
<借助Redis Bitmap实现简单的布隆过滤器>
Guava中BloomFilterStrategies实现了布隆过滤器
上面那篇redis实现布隆过滤器的思路:
- 创建一个布隆过滤器,重要参数,hash函数个数,redis中bitmap位图长度
- 最重要的实现getBitIndices(element),就是根据传入的元素,返回hash后的,二进制序列为1的位置的数组
- 然后就是应用阶段。保存元素位图信息,和,判断元素是否存在
- 保存元素信息:getBitIndices返回的index集合,都设置为true
- 判断元素存在:getBitIndices返回的index集合,判断是否存在false,有false则不存在;否则,存在。