面试题答案
一键面试实现思路
- 选择合适的布隆过滤器库:可以使用现有的开源库,如Google Guava中的BloomFilter,它提供了简单易用的接口,在Java开发中较为常用。对于其他语言也有相应的布隆过滤器实现库。
- 确定布隆过滤器的参数:
- 预计元素数量:根据业务预估系统可能访问的不同key的数量。
- 误判率:根据业务容忍度设置合适的误判率,误判率越低,需要的存储空间越大。
- 初始化布隆过滤器:在系统启动时,根据上述参数初始化布隆过滤器。
- 缓存读写流程:
- 写操作:当数据写入缓存时,同时将对应的key添加到布隆过滤器中。
- 读操作:在读取缓存前,先通过布隆过滤器判断key是否可能存在。如果布隆过滤器判断不存在,则直接返回,无需查询后端数据库,从而避免缓存穿透。
关键代码片段(以Java + Guava为例)
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
// 初始化布隆过滤器
BloomFilter<String> bloomFilter = BloomFilter.create(
Funnels.stringFunnel(Charsets.UTF_8),
/*预计元素数量*/1000000,
/*误判率*/0.01);
// 写操作
public void set(String key, String value) {
// 将key添加到布隆过滤器
bloomFilter.put(key);
// 将数据写入Redis缓存
redisTemplate.opsForValue().set(key, value);
}
// 读操作
public String get(String key) {
// 通过布隆过滤器判断key是否可能存在
if (!bloomFilter.mightContain(key)) {
return null;
}
// 从Redis缓存读取数据
return redisTemplate.opsForValue().get(key);
}
在其他语言中,类似地先引入布隆过滤器库,然后根据库提供的接口按照上述逻辑进行实现,如Python可以使用pybloomfiltermmap
库等。