面试题答案
一键面试解决缓存穿透的措施
- 布隆过滤器:在请求数据前,先通过布隆过滤器判断数据是否存在。布隆过滤器可以高效地判断一个元素是否属于一个集合,虽然存在一定误判率,但能有效拦截大量不存在的数据请求,避免穿透到数据库。
- 缓存空值:当从数据库查询到数据不存在时,也将这个空值缓存起来,并设置一个较短的过期时间,这样后续相同请求可以直接从缓存获取空值,而不会穿透到数据库。
布隆过滤器的Kotlin代码实现
import com.google.common.hash.BloomFilter
import com.google.common.hash.Funnels
import java.nio.charset.StandardCharsets
class BloomFilterUtil {
private val expectedInsertions = 1000000L
private val fpp = 0.01
private val bloomFilter: BloomFilter<CharSequence> = BloomFilter.create(
Funnels.stringFunnel(StandardCharsets.UTF_8),
expectedInsertions,
fpp
)
fun put(value: String) {
bloomFilter.put(value)
}
fun mightContain(value: String): Boolean {
return bloomFilter.mightContain(value)
}
}
使用示例:
fun main() {
val bloomFilterUtil = BloomFilterUtil()
val data = "exampleData"
bloomFilterUtil.put(data)
if (bloomFilterUtil.mightContain(data)) {
// 这里可以去查询缓存或数据库
println("数据可能存在,进行后续查询操作")
} else {
println("数据大概率不存在,直接返回")
}
}