JAVA全系列 教程
3762个小节阅读:7089k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。
xxxxxxxxxx
private final String LOCK_PREFIX = "lock:";
public User getUser(Long id) throws InterruptedException {
//设置个Key
User user = (User) template.opsForValue().get("user:" + id);
if (user != null) {
return user;
} else {
Boolean b = tryLock(LOCK_PREFIX + id, "1", 100, TimeUnit.SECONDS);
if (b) {
log.info("开始执行业务逻辑");
// 1、从数据库中查询
User u = userMapper.selectById(id);
// 2、加Redis缓存
template.opsForValue().set("user:" + id, u);
return u;
} else {
Thread.sleep(2000);
return getUser(id);
}
}
}
// 抢占式 互斥加锁
public Boolean tryLock(String key, String value, long timeout, TimeUnit unit) {
// setIfAbsent已经是setNx + expire的合并命令
return template.opsForValue().setIfAbsent(key, value, timeout, unit);
}
1.Redis技术中缓存击穿如何解决。
A 对空值缓存
B 搭建Redis高可用
C 使用布隆过滤器
D 加互斥锁
1=>D