redis緩存的穿透和雪崩
阿新 • • 發佈:2017-08-03
map 數據庫查詢 發生 通過 時間 過期 並發訪問 項目 策略
最近寫項目 用到redis,想要把其中的主要問題和大家分享一下:
首先是 穿透
個人的理解因為查詢一個不存的數據是,因為第一次查詢是到數據庫,所以要查詢這個不存的數據時會越過redis
直接去數據庫查詢,所以才會形成穿透;
解決辦法:
最常見的是布隆過濾器,將所有的數據哈希到一個足夠大的bitmap中,不存在的數據會被bitmap掉,
還有一種方法就是將查詢結果不論是不是空都存入緩存,不過將為空的緩存時間減短,不超過5分鐘。。
雪崩
是和穿透有很大聯系的,在緩存失效的這段時間,發生大量的穿透,所有的查詢到達服務器,形成雪崩
解決辦法
- 在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
- 可以通過緩存reload機制,預先去更新緩存,再即將發生大並發訪問前手動觸發加載緩存
- 不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻
- 做二級緩存,或者雙緩存策略。A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置為短期,A2設置為長期。
redis緩存的穿透和雪崩