(2) 路由策略
routing方法根据样本计算出路由key值。
exceptedInsertions方法根据样本获取到路由key值,然后计算期望插入的样本数量。
(3) 成员变量
ROUTE_MAP是本地缓存,存储RoutingStrategy对象routing方法计算出的路由key值以及对应的RedisBloomFilter实例。
routingStrategy是路由策略RoutingStrategy实例。
bfRedisKeyPrefix是Redis布隆过滤器bit数组在redis中对应的key值前缀。
bfKeysMappingRedisKey存储了所有Redis布隆过滤器bit数组在redis中对应的key(即bfRedisKeyPrefix + 路由key)的集合。
(4) put操作
获取当前样本对象的routeKey,ROUTE_MAP的computeIfAbsent方法根据routeKey获取对应的Redis Bloom Filter,如果不存在则创建一个新的Redis Bloom Filter对象实例并保存到ROUTE_MAP中。变量bloomFilterRedisKey = bfRedisKeyPrefix + routeKey,也就是Redis Bloom Filter bit数组在redis中存储的key值,最后保存在分布式缓存的集合中(即bfKeysMappingRedisKey对应的集合)。
(5) mightContain操作
和put操作的流程基本一致,在获取routeKey对应的Redis Bloom Filter实例的时候,如果不存在需要判断分布式缓存bfKeysMappingRedisKey对应的集合中是否存在bloomFilterRedisKey,如果不存在说明put操作没有创建对应的Redis Bloom Filter实例,直接返回null。
(6) 监控信息
approximateElementCount,布隆过滤器中可能存在的元素个数。
bitSize,布隆过滤器bit数组大小。
bitCount,布隆过滤器bit数组中bit位是1的数量。
keyLength,布隆过滤器bit数组通过strlen统计的长度。
注:布隆过滤器的bit数组在redis中对应的数据类型是String哦!
应用场景网页爬虫对URL的去重。
黑名单,垃圾邮件过滤。
解决数据库缓存击穿。
实际应用