本文有参考其他文章及部分个人理解,如有错误以及意见,欢迎交流。
理解:
key批量失效:大面积的缓存失效,请求打崩数据库同时大面积失效,redis等同于无,这个数量等级的请求直接打到数据库,如果没做熔断等策略,基本就瞬间挂,那么依赖这个库的所有接口都会报错。
解决方案:
理解:
热点key失效瞬间:非常热点key,在不停的扛着大并发,并发集中在这个一个点,当key失效的瞬间,持续的大并发就击穿缓存。
解决方案:
示例:
public String getValue(String key) {
String value= redis.get(key, String.class);
if (Tools.isEmpty(value)) {
synchronized(lockHelp) {
value = redis.get(key,String.class);
if (Tools.isEmpty(value)) {
value = db.query(key);
redis.set(key, value, 1000);
}
}
}
return value;
}
示例
public String get(key) {
String value = redis.get(key);
if (value == null) { //代表缓存值过期
//设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功
value = db.get(key);//查询db的值
redis.set(key, value, expire_secs);//set进key
redis.del(key_mutex);//删除热点key
return value;
} else {//这个时候代表同时间的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
sleep(10);
get(key); //重试
}
} else {
return value;
}
}
理解:
不存在的key:用户不断发起缓存和数据库中均不存在的数据请求,导致数据库压力过大,严重会击垮数据库。
解决方案: