**缓存击穿(Cache Breakdown)**是指:某个热点 key 在缓存中过期的瞬间,大量并发请求同时打到数据库,造成数据库瞬时压力剧增。
下面从原因 → 解决方案 → 实战建议来说。
⚠️ 注意区分:
思路:只有一个线程去查 DB,其他线程等待。
String value = redis.get(key);
if (value == null) {
if (redis.setnx(lockKey, "1", 3)) { // 获取锁
value = db.query();
redis.set(key, value, expire);
redis.del(lockKey);
} else {
Thread.sleep(50);
return getFromCache(key); // 重试
}
}
✅ 优点:简单有效
❌ 缺点:有锁竞争,实现稍复杂
思路:Redis 不设置真实过期时间,业务自己判断过期。
{
"value": "真实数据",
"expire": 1700000000
}
if (now > expire) {
if (tryLock()) {
asyncRefresh();
}
}
return value;
✅ 优点:
❌ 缺点:
✅ 适合:
✅ 适合超高并发场景
生产环境常用方案:
| 方案 | 推荐度 | 说明 |
|---|---|---|
| 互斥锁 | ⭐⭐⭐⭐ | 最通用 |
| 逻辑过期 | ⭐⭐⭐⭐⭐ | 体验最好 |
| 永不过期 | ⭐⭐⭐ | 简单 |
| 请求合并 | ⭐⭐⭐⭐ | 高性能 |
如果你愿意,可以告诉我:
我可以给你可直接用的代码模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。