目录
1、缓存雪崩
1.1 前提
redis会定期清理缓存
1.2 缓存雪崩说明
在redis中key=menu的键值恰好没有,或者被redis清理掉了;此时有5000多个用户并发查询key=menu,查询会越过缓存,直接查询数据库,导致数据库崩了
1.3 解决缓存雪崩
方案:
- 设置key永不过期
- 加上锁
在java代码中的实现
public class Test {
public String getData(String key){
Lock lock = new MyLock();
//从redis查询数据
String value = getRedis(key);
if(StringUtils.isEmpty(value)){
if(lock.tryLock()){
//从数据库查询值
value = getMysql(key);
if(StringUtils.isEmpty(value)){
//存入redis
setRedis(key,value);
}
//释放锁
lock.unlock();
}else{
//获取锁失败,等待10ms,在重试
result = getData(key);
}
}
return value;
}
}
2、缓存穿透
2.1 缓存穿透原因
一个值在redis中查询不到,在数据库中也查询不到,如果用户对此查询这个值,就会导致缓存失效,还要重复查询数据库
正常请求图:第一次走1,2,3,4,之后就只会走1和4,从缓存拿数据
缓存穿透:此时redis和数据库都不存在order=1,如果多次查询order=1,每次都要查询缓存和数据库
2.2 解决缓存穿透
1,
对订单表所有数据查询出来放到布隆过滤器
,
经过布隆过滤器处理的数据很小
(
只存
0 或 1)
2,
每次查订单表前
,
先到过滤器里查询当前订单号状态是
0
还是
1, 0
的话代表数据库没有数据
, 直接拒绝查询