Redis bloom-filter 在千万数据场景应用

在网页爬虫、垃圾邮件检测、用户频控 等 元素是否存在于某个集合中的判断时,为了节省内存,往往会考虑使用 布隆过滤器。

我们遇到了一个类似的场景,比如 用户是否存在集合中。
最开始用户数少的时候,使用 Redis string对象,set biz:uid true 来标识用户存在集合中。
查询时根据 get biz:uid 来判断结果为空识别使用是否在集合中。

随着数据量增大到千万级,忽然有一天下午,Redis内存使用率报警,超过60%,几个小时后,Redis内存写满。出现大量报错。

后来通过计算,发现 redis string 的内存利用率太低,大概只有 5% 左右,想找一个节省内存的办法。

(1) 问题在本地复现

(2) 千万级是否判断是否存在方案调研

(2.1) 方案对比

(2.2) bloom filter 应用

  1. 网页爬虫对 URL 去重,避免爬取相同 URL 的网页;
  2. 反垃圾邮件,从数十亿个垃圾邮件列表中判断某个邮箱是否垃圾邮箱;
  3. Medium 使用布隆过滤器避免推荐给用户已经读过的文章;
  4. Google BigTable,Apache HBbase 和 Apache Cassandra 使用布隆过滤器减少对不存在的行和列的查找。

(3) redis bloomfilter常用命令

| :– | :– | :– |
| | | |

(4) 代码中使用

(6) 内存占用

(7) 上线后bloom filter的坑

(7.1) 批量


参考资料

[1] bloom-filter介绍-redis.io
[2] Probabilistic data structures
[3] Probably and No: Redis, Probabilistic, and Bloom Filters
[4] Bloom Filter Datatype for Redis
[5] Low latency and compact probabilistic data structures