一、缓存穿透:
现象:
缓存和数据都不存在,比如id=-1,
解决方法:
1、接口层加基础校验,id<0直接拦截
2、对于缓存和数据库都不存在的数据按key-null存放,缓存时间设置较短30s,
二、缓存击穿
现象:
超高并发请求缓存中没有而数据库有的数据,导致数据库压力瞬间增大
解决方法:
1、设置热点数据有效时间永久
2、加互斥锁
public static String getDate(String key){
String result = getDataFromRedis(key);
if(result==null){
if(reenlock.tryLock()){
result=getDataFromMysql(ket);
if(result!=null){
setDataToCache(key,result);
}
reenlock.unlock();
}
else{
Thread.sleep(100);
result = getData(key);
}
}
return result;
}
三、缓存雪崩
现象:
大批量数据同时到期,造成数据压力过大甚至宕机,
解决方法:
1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2、热点数据分布在不同缓存数据库
3、热点数据设置永不过期