面试题答案
一键面试布隆过滤器在范围查询场景提升查询效率的原理
- 减少磁盘I/O:Cassandra数据存储在磁盘上,进行范围查询时,如果没有布隆过滤器,可能需要读取大量磁盘数据块来判断数据是否存在。布隆过滤器通过快速判断数据可能存在的位置,过滤掉明显不存在目标数据的磁盘块,从而减少不必要的磁盘I/O操作,提升查询效率。
- 空间效率高:布隆过滤器使用位数组来表示数据集合,相较于完整存储数据,占用空间极小。在范围查询时,它能以较低的空间开销快速给出数据是否可能存在的结果,使得在内存中可以快速对大范围数据进行筛选。
布隆过滤器的工作原理
- 初始化:创建一个大小为
m
的位数组,初始值全部为0。同时选择k
个不同的哈希函数h1, h2, ..., hk
。 - 添加元素:当要向布隆过滤器中添加元素
x
时,通过k
个哈希函数分别计算出k
个哈希值h1(x), h2(x), ..., hk(x)
,然后将位数组中对应位置的比特位设置为1 (即bitArray[h1(x) % m] = 1
,bitArray[h2(x) % m] = 1
, ...,bitArray[hk(x) % m] = 1
)。 - 查询元素:查询元素
y
时,同样通过k
个哈希函数计算出k
个哈希值h1(y), h2(y), ..., hk(y)
,然后检查位数组中对应位置的比特位是否都为1。如果都为1,则认为元素y
可能存在于集合中;如果有任何一个比特位为0,则元素y
一定不存在于集合中。
布隆过滤器在Cassandra中的具体实现方式
- 配置使用:在Cassandra的表配置中,可以通过设置
bloom_filter_fp_chance
参数来控制布隆过滤器的误判率。该参数表示一个不存在的元素被误判为存在的概率,默认值为0.01 。较低的误判率会增加布隆过滤器的大小和计算哈希函数的开销,较高的误判率则可能导致更多不必要的磁盘I/O。 - 数据结构实现:Cassandra使用
Murmur3
哈希函数作为默认的哈希函数来计算布隆过滤器的哈希值。在内部,布隆过滤器的数据结构由一个字节数组(表示位数组)和相关的元数据(如哈希函数数量、位数组大小等)组成。在进行范围查询时,Cassandra首先根据查询的范围,利用布隆过滤器判断哪些SSTable(Sorted String Table,Cassandra的数据存储单元)可能包含目标数据,然后只对这些可能的SSTable进行进一步的读取和数据筛选操作。