查询一个不存在的数据时,数据库(比如mysql)查询不到数据也不直接写入缓存,导致每次请求都会查询数据库,如果有人恶意查询空数据可能会导致数据库宕机
不存在的数据也放入缓存中,这样的缺点是,当有大量空数据时,会占用很多额外内存
布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存在,布隆过滤器说这个数存在可能不存在。当数据一定不存在时就可以直接返回。
将一个数进行 次哈希运算,可以得到 个位置,在长为 的布尔数组里面把这 个位置标为 true。查询时,只需要判断这 个位置是否均为 true即可。
由于底层使用是哈希,哈希冲突会导致误判,这时可以自行设置参数来调整误判的概率。
布隆过滤器提供了两个参数,分别是预计加入元素的大小 ,运行的错误率 。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ,以及无偏 hash函数的个数 。 它们之间的关系比较简单:
错误率越低,位数组越长,控件占用较大
错误率越低,无偏 hash函数越多,计算耗时较长 。布隆过滤器提供了两个参数,分别是预计加入元素的大小 ,运行的错误率 。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ,以及无偏 hash函数的个数 。 它们之间的关系比较简单:
错误率越低,位数组越长,空间占用越大
错误率越低,无偏hash函数越多,计算耗时越长
在业务入口(比如网关,Controller层)对参数进行校验,如果参数明显非法(比如出现负数,或者太大),直接拦截即可

