缓存问题详解
一、缓存穿透(查不存在的数据)
问题描述:请求查询数据库中根本不存在的数据(比如ID=-1的数据),导致每次请求都绕过缓存直接访问数据库。
解决方案:
- 缓存空对象:
- 原理:即使数据库查询为空,也把这个”空结果”缓存起来(例如存为
null
) - 示例代码:
1
2
3
4
5
6
7
8
9
10
11// 伪代码示例
Object data = cache.get(key);
if(data == null) {
data = db.query(key);
if(data == null) { // 数据库也没有
cache.set(key, "NULL", 300); // 缓存空值5分钟
} else {
cache.set(key, data, 3600); // 缓存真实数据1小时
}
}
return data.equals("NULL") ? null : data; - 注意事项:要给空值设置较短的TTL(如5分钟),避免占用太多内存
- 原理:即使数据库查询为空,也把这个”空结果”缓存起来(例如存为