### **緩存穿透**
**描述**
???????緩存穿透是指用戶不斷請求查詢緩存和數據庫中都沒有的數據,出于容錯的考慮,如果從緩存中查不到數據則會去數據庫中查詢,因此緩存穿透也將導致每次請求都會到數據庫中去查詢,失去了緩存的意義。
**解決方案:**
???????緩存空對象:將緩存和數據庫中都不存在的數據,對key進行set (key,null),并設置緩存的有效時間
### **緩存擊穿**
**描述**
???????緩存擊穿是指redis中存在對應key的數據,但在緩存時間過期之后,有大量并發請求在緩存中查詢不到數據后會去數據庫查詢數據,引起數據庫壓力過大。
**解決方案:**
1. 緩存持久化存儲
2. 互斥鎖:在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一個mutex key,當操作返回成功時,再進行load db的操作并回設緩存;否則,就重試整個get緩存的方法。
SETNX,是「SET if Not eXists」的縮寫,也就是只有不存在的時候才設置,可以利用它來實現鎖的效果。
只允許一個線程重建緩存,其他線程等待重建緩存的線程執行完,重新從緩存獲取數據即可。

### **緩存雪崩**
**描述**
???????當緩存服務器重啟或者大量緩存集中在某一個時間段失效,而引起數據庫壓力過大,緩存擊穿指并發查同一條數據,緩存雪崩是不同數據都過期了。
**解決方案:**
1. 存數據的過期時間設置隨機,防止同一時間大量數據過期現象發生
2. 用加鎖或者隊列的方式保證來保證不會有大量的線程對數據庫一次性進行讀寫