1. 程式人生 > >redis緩存的穿透和雪崩

redis緩存的穿透和雪崩

map 數據庫查詢 發生 通過 時間 過期 並發訪問 項目 策略

最近寫項目 用到redis,想要把其中的主要問題和大家分享一下:

首先是 穿透

個人的理解因為查詢一個不存的數據是,因為第一次查詢是到數據庫,所以要查詢這個不存的數據時會越過redis

    直接去數據庫查詢,所以才會形成穿透;

解決辦法:

最常見的是布隆過濾器,將所有的數據哈希到一個足夠大的bitmap中,不存在的數據會被bitmap掉,

還有一種方法就是將查詢結果不論是不是空都存入緩存,不過將為空的緩存時間減短,不超過5分鐘。。

雪崩

是和穿透有很大聯系的,在緩存失效的這段時間,發生大量的穿透,所有的查詢到達服務器,形成雪崩

解決辦法

  1. 在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
  2. 可以通過緩存reload機制,預先去更新緩存,再即將發生大並發訪問前手動觸發加載緩存
  3. 不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻
  4. 做二級緩存,或者雙緩存策略。A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置為短期,A2設置為長期。

redis緩存的穿透和雪崩