知识卡片

布隆过滤器应对亿级数据查重:用可容忍的误判率换取空间与速度

普通读书笔记卡

内容

页面解析系统需要对几亿量级的页面数据做查重,如果用精确的数据结构(如把所有已处理过的URL或内容哈希都存进普通集合/数据库表)来判断”这条数据是否已经处理过”,存储空间和查询开销会随数据量线性甚至更快增长。团队采用bloomfilter(布隆过滤器)配合Redis实现这个查重能力,布隆过滤器是一种概率型数据结构,用远小于精确存储方案的空间就能回答”某个元素有极大概率已经存在”或”某个元素一定不存在”这类判断,代价是存在一定的误判率(可能把没出现过的元素误判为已出现),但对于”数据检索更新和查重”这种允许极低误判率、但对空间和速度高度敏感的场景非常合适。这个案例给出一条通用思路:当判断”是否存在”这个操作本身的数据量级达到几亿甚至更高时,与其追求100%精确的判断结果,不如评估业务是否能容忍极低概率的误判,如果可以容忍,布隆过滤器这类概率型数据结构能在空间和速度上带来数量级的提升。

参考来源

- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.12 基于Xapian的垂直搜索引擎的构建分析"节,"6.12.3 垂直搜索的引擎架构","3.页面解析器(Parser)"(源文件:_epub-src/OEBPS/Text/Chapter6_12_4.xhtml) - 结论依据:原文说明"另外实现查重的功能(几亿数据查重,采用bloomfilter+Redis实现)、bloomfilter的及时引入确实很救命,数据检索更新和查重节省了很多时间",直接支撑本卡片结论。 - 原始内容:另外实现查重的功能(几亿数据查重,采用bloomfilter+Redis实现)、bloomfilter的及时引入确实很救命,数据检索更新和查重节省了很多时间。