1、什么叫着缓存击穿?
缓存击穿:就是略过缓存了,直接请求数据库,导致数据库挂了
一般的缓存设计就算下面这种写法:
// 判断缓存key是否存在
if(缓存中存在){
return redis.get(key);
}
// 查询数据库
value = DB.query();
// 保存在缓存
redis.set(key,value);
但是这样会存在一个问题???那就是在多并发的时候,所有请求先判断key都不存在,都跑到DB中来了,所以拖垮数据库了
看我怎么优化呢?双重加锁就可以解决
// 判断缓存key是否存在
if(缓存中存在){
return redis.get(key);
}
synchronized(this){
// 判断缓存key是否存在
if(缓存中存在){
return redis.get(key);
}
// 查询数据库
value = DB.query();
// 保存在缓存
redis.set(key,value);
}
这样就完美解决了缓存击穿问题。