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);
}
這樣就完美解決了緩存擊穿問題。