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 应用
- 网页爬虫对 URL 去重,避免爬取相同 URL 的网页;
- 反垃圾邮件,从数十亿个垃圾邮件列表中判断某个邮箱是否垃圾邮箱;
- Medium 使用布隆过滤器避免推荐给用户已经读过的文章;
- 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