概念

一个 key 传给布隆过滤器,如果它说存在那很大概率是存在的,如果它说不存在,那么绝对不存在,因此布隆过滤器可以用于在数据库之前对于 key 值的判断,如果不存在就无需进入 DB。

应用

可以使用布隆过滤器解决缓存穿透的问题,数据预先存入布隆过滤器中,当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在直接返回;如果存在再查询缓存查询数据库。此外还可以使用它来做黑名单校验、垃圾邮件识别等,但需要注意会有一定的误判率。

原理实现

布隆数据库底层还是使用 bitmap 来存储元素标记,一个 key 被加入 bl 时会先使用几个无偏 hash 函数计算出哈希值对数组长度取模,得出它的几个不同位置,接着在位数组上对他们置 1 。如果查询某元素是否存在,则先 hash 后判断位置是否都为1。因此如果 bl 判断 key 不存在则一定是不存在,如果判断存在也可能是其他元素影响到,这就会造成误判的情况。具体地,如果位数组长度足够大,或者元素不是很多,则这种误判断的几率会大大降低,可以通过设置参数来解决。
Redis 中并不存在这种具体的对象供我们使用,Java 中可以使用 Redission 来进行 Redis 连接,并在其中使用布隆过滤器功能。