1. 程式人生 > >快取穿透,快取失效(快取雪崩)和快取併發

快取穿透,快取失效(快取雪崩)和快取併發

  • 快取穿透: 通常快取都是根據key去查詢value,如果快取中不存在,則去DB中查詢,如果查詢到了則將此key->value寫入快取。但是,對於某些一直不存在的資料,每次都無法在快取中查詢到,所以每次都要去DB中查詢,DB中也找不到所以沒法寫入快取,如此往復,便失去了快取的意義。

    解決方法:

    1. 對到DB中查詢為空的情況也進行快取,但是這個資料的快取過期時間需要設定得短一點;
    2. 將所有可能存在的資料根據key雜湊到一個bitmap中,不可能存在的資料直接被bitmap過濾掉,不去查詢DB。
  • 快取失效(快取雪崩): 高併發下,我們同時給大量快取設定了相同的失效時間,導致某一時刻快取同時失效;或者機器重啟導致的快取全部同時失效。這會讓大量請求同時去查詢DB,給DB造成巨大的壓力。

    解決方法:

    1. 控制讀取DB的執行緒數量;
    2. 隨機設定快取的失效時間,避免大量快取同時失效。
  • 快取併發:高併發下,多個執行緒查詢到某個快取失效(或者該key沒有快取),同時去DB中查詢並設定快取,引起的壓力問題。

    解決方法:

    1. 當查詢到key為空時,加鎖,然後查DB,更新快取,解鎖。