布隆过滤器是采用一个很长的二进制数组,通过一系列的Hash函数来确定数据是否存在。其能够完全确定不存在,只能确定可能存在,可以用来防止恶意访问导致的缓存穿透问题。
因为是可能存在的,所以我们可以进行如下操作来减少误判
增加二进制数组位数
增加Hash次数
Java运用布隆过滤器
redission-all 建议误判率不要小于1%,不然会增加Hash的次数,增加CPU的负担
项目中的使用流程
1、应用启动时,初始化布隆过滤器
2、用户发来请求时,判断布隆过滤器是否包含编号
3、布隆过滤器不包含编号时,返回数据不存在消息
4、包含编号时,读取Redis的缓存数据
5、Redis缓存数据不存在时,读取数据库,刷入Redis缓存中
假如商品被删除了该怎么
布隆过滤器因为某一位二进制可能被多个编号Hash引用,因此布隆过滤器无法直接处理删除数据的情况
解决方案1:定时异步重建布隆过滤器
解决方案2:计数Bloom Filter