八股 redis
緩存穿透 緩存擊穿 緩存雪崩
緩存穿透:訪問一個數(shù)據(jù)庫不存在的值 redis緩存查不到 去數(shù)據(jù)庫查 數(shù)據(jù)庫也查不到 所以不會緩存到redis 導(dǎo)致每次查詢這種不存在的值都會給數(shù)據(jù)庫帶來壓力 。解決方案: 1.緩存空值。當(dāng)在數(shù)據(jù)庫中查詢不到的時(shí)候 在redis里把這個值定位空 缺點(diǎn):大量空值帶來內(nèi)存存儲壓力 2.布隆過濾器 布隆過濾器是存儲0 1的數(shù)組 它使用多個哈希函數(shù)以減少誤判 只有這多個哈希值函數(shù)計(jì)算出來的哈希值中的值為1 代表可能有 才會進(jìn)入redis查詢
緩存擊穿:當(dāng)一個熱點(diǎn)key過期時(shí) 有大量訪問請求到達(dá) 導(dǎo)致不得不去查詢數(shù)據(jù)庫 給數(shù)據(jù)庫帶來壓力。解決方案:1. 互斥鎖 當(dāng)緩存未命中時(shí) 持鎖 去數(shù)據(jù)庫查詢重建緩存數(shù)據(jù) 建立緩存 釋放鎖 實(shí)時(shí)性很強(qiáng) 性能不高 2.邏輯過期 實(shí)際的key沒有設(shè)置過期時(shí)間 不過它的字段里有expire 里面有過期時(shí)間 當(dāng)緩存命中時(shí) 檢查expire 判斷是否過期 如果過期 則持鎖 并開一個新線程去查詢數(shù)據(jù)庫來更新緩存 同時(shí)原線程立即返回舊值,在此期間有其他訪問來的時(shí)候 發(fā)現(xiàn)過期并持鎖失敗時(shí) 立即返回舊值 性能好實(shí)時(shí)性差。
緩存雪崩: 當(dāng)多個熱點(diǎn)key同時(shí)過期 大量訪問請求可能讓數(shù)據(jù)庫宕機(jī) 解決方案: 對不同的key 的ttl增加隨機(jī)值 差異化過期時(shí)間 或者使用邏輯過期