原理:布隆过滤器写入数据实际上是将数据通过哈希算法,算出一个位数(位数=数组下标),存到一个二进制的数组上。数组上0代表不存在,1代表存在。
一个数据可能会由多个哈希算法,计算出多个位数,分别将下标为该位数的位置改为1。一个下标被多个数据用到时,还是置1
进行读操作时,判断数据存在否,该笔数据通过几个哈希算法得出几个位数,布隆过滤器会去判断几个位数的的数字是0还是1 。如果有一个为0就表示不存在,全为1表示可能存在。因为布隆过滤器是存在误差的,并且这个误差是可以通过参数配置的。两个不同的数据通过几个哈希函数计算出来的位数可能完全一样。
配置布隆过滤器误差配的越小,意味着一次数据写入或者读运算的哈希函数越多,二进制的数组越长,很影响性能和效率,所以误差不要配的太小。
删数据时,不能轻易的删除,删除相当于是把某个数据计算出来的下标都置0。因为某个位数的下标的1可能是多个数据都用到,会影响到别的数据。要采用计数布隆过滤器或者通过任务调度生成新的过滤器替换掉旧的。
应用:布隆过滤器可以用来解决redis缓存穿透。缓存穿透是大量查不到数据的请求 穿过redis访问数据库,给数据库造成压力。在redis上一层加上布隆过滤器,能过滤掉大部分请求,压力能减小很多。
当一个查询过来时,布隆过滤器判断是否存在,如果判定为不存在,那么一定不存在。如果判定为存在,该那么笔数据实际可能存在也可能不存在。那就去redis拿,redis不存在,就去数据库拿。