现学现卖。很不全的介绍。文末参考其他的博客
布隆过滤器的之前
hashmap
hashmap在查询中非常快,平均近似O(1),但现在的数据很大,远远超过内存的大小。所以数据都保存在hashmap中不现实。
缓存穿透
一般公司的架构是,客户端发送请求,服务端会从缓存redis等服务器中查找,如果没有在从mysql中查找,如果查找到了在缓存到redis,如果客户端发送大量不错在的请求,那么在缓存中,mysql中都不能查询到,那么msql有可能接受不了这么大的并发,而出现 死机。布隆过滤可以有效的解决这个问题。
布隆过滤器原理
布隆过滤器是定义一个很长的二进制向量,长度位n,每位 初始都是零。如下(盗用别人的图)
新增: 假设我们定义三个hash 函数,如果先对请求key,分别用三个hash函数求key的哈希值在对n取余,得到的值定位向量的下标,且把这个bit位设置为1.
查找: 请求查询中,通过三个hash函数求请求key的哈希值,并对n取余,计算二进制向量下标位的值,如果都是1,那么可能请求已经存在。
如果有一个不为1,那么这个请求必定不存在。那么这样就不用去redis缓存和mysql数据库中查询了。
当都是1时,为什么请求可能存在呢? 因为这三个位可能被其他请求key的哈希值占据了位置。不能保证这个一定存在。也可能是出现hash冲突。就是两个不同的key,通过三个hash函数得到的哈希值都一样。貌似这个几率很小。或者hash函数取得不对
删除: 对于删除,布隆过滤器就无能为力了,删除的请求key的哈希值,占据的三个bit位可能其他存在的请求key也占据了其中一个或多个位,如果你把bit位的1改为0,导致删除了其他的请求key。所以删除是不可行。
水平有限,研究的不多,就介绍的这么多。可以参考其他博客。
布隆过滤器的介绍,在java和redis中的使用 :https://www.cnblogs.com/CodeBear/p/10911177.html