(一)缓存穿透
原因:缓存和数据库中都没有的数据,而用户不断发起请求。导致数据库压力过大
解决方案:
(1)缓存空值:直接将空值写入缓存,设置短的超时时间
Object nullValue = new Object();
try {
Object valueFromDB = getFromDB(uid); //从数据库中查询数据
if (valueFromDB == null) {
cache.set(uid, nullValue, 10); //如果从数据库中查询到空值,就把空值写入缓存,设置较短的超时时间
} else {
cache.set(uid, valueFromDB, 1000);
}
} catch(Exception e) {
// 出现异常也要写入缓存
cache.set(uid, nullValue, 10);
}
(2)布隆过滤器:在访问缓存层和存储层之前,可以通过定时任务或者系统任务来初始化布隆过滤器,将存在的 key 用布隆过滤器提前保存起来,做第一层的拦截。
(3)布隆过滤器简介
布隆过滤器是由一个长度为m
比特的位数组与k
个哈希函数组成的数据结构。比特数组均初始化为0
ÿ