1.緩存雪崩
(1)什么是緩存雪崩
緩存雪崩指的是在同一時刻,緩存大量失效,導致大量的請求直接到了數據庫,數據庫壓力劇增,引起系統(tǒng)崩潰。可能出現的情況有:
①大量的key設置了相同的過期時間,導致在緩存在同一時刻全部失效,造成瞬時DB請求量大、壓力驟增,引起雪崩。
②緩存系統(tǒng)出現故障,造成緩存系統(tǒng)無法提供服務,造成瞬時DB請求量大、壓力驟增,引起雪崩。
(2)怎么避免緩存雪崩
事前 :
①在設置key的過期時間時,在過期時間上加上一個隨機值,防止大量key同時過期。
②搭建高可用的緩存架構,比如使用 哨兵+主從 結構或者使用 cluster模式,避免緩存系統(tǒng)出現故障。
③可以在系統(tǒng)中使用ehcache做個小緩存,防止redis崩掉之后,還有一部分緩存。
事中 :
①對系統(tǒng)請求進行降級和限流,防止數據庫之間崩掉。
事后 :
趕快使用redis持久化的數據,快速恢復緩存數據
2.緩存穿透
(1)什么是緩存穿透
緩存穿透是指有請求訪問到了并不存在的數據,這樣請求就會直接到達數據庫,數據庫就會壓力劇增。
(2)怎么避免緩存穿透
①可以使用一個足夠大的bitmap,將可能存在的key放到里面,請求過來先檢查bitmap里面有么有,如果沒有直接過濾掉這個請求。
②將數據庫查詢出來的空值也放到緩存里面去,是這個key對應一個空值,只是這個key設置的時間比較短。
3.緩存擊穿
(1)什么是緩存擊穿
一個存在的key,在緩存過期的一刻,同時有大量的請求,這些請求都會擊穿到數據庫,造成數據庫請壓力驟增。
(2)怎么避免緩存擊穿
在訪問key之前,采用SETNX(set if not exists)來設置另一個短期key來鎖住當前key的訪問,訪問結束再刪除該短期key。