# 我們都知道redis是為了給數據庫做擋箭牌的,減輕數據庫的壓力
## 1.緩存擊穿
高并發時,當一個key非常熱點(類似爆款),在不停的扛著大并發,當這個key在失效的一瞬間,持續的大并發直接請求數據庫并且設置到緩存中,導致性能下降
解決辦法:加鎖《同步鎖或者分布式鎖》
~~~
public Object index() {
Object obj = redisTemplate.boundValueOps("xxxx").get();
if (obj==null){
synchronized (this){
obj = redisTemplate.boundValueOps("xxxx").get();
if (obj!=null){
return obj;
}
//TODO 查詢數據庫并添加到緩存中
}
}
return obj;
}
~~~
### 2.緩存雪崩
緩存集中過期,或者緩存服務器宕機,導致大量請求訪問數據庫,造成數據庫壓力過大,宕機
解決方案
1.隨機失效
2.redis哨兵模式
### 緩存穿透
數據庫和緩存不存在數據,導致每次請求都去查數據庫,這時的用戶可能是攻擊者,如用戶發起id為-1的數據或者id特別大(不存在的數據)導致數據庫壓力過大或者宕機
解決方案
1.參數校驗
2.緩存空對象(設置過期時間)
3.布隆過濾器(白名單或者黑名單)