Redis—問題(1)
寫在前面
Redis 是一種 NoSQL 資料庫,包含多種數據結構、支援網路、基於記憶體、可選持久性的鍵值對存儲資料庫,在我們的日常開發中會經常使用 Redis 來解決許多問題,比如排行榜、消息隊列系統、計數器 以及 快取系統等。
在作為快取使用時,不可避免的會遇到快取穿透、快取雪崩、快取擊穿(熱點 key) 的問題,那麼究竟這些問題具體值的是什麼,又該如何解決呢?
什麼是快取穿透
快取穿透是指客戶端請求的數據在快取和資料庫中都不存在,引起快取失效,並會對資料庫造成極大的壓力。
常見的解決方案有兩種:
- 快取空對象
- 優點:實現簡單,維護方便
- 缺點:
- 額外的記憶體消耗
- 可能造成短期的不一致
- 布隆過濾
- 優點:記憶體佔用少,沒有多餘的key
- 缺點:
- 實現複雜
- 可能存在誤判
- 增加 id 的複雜度,避免被猜到 id 規律。
- 做好數據的基礎格式校驗。
- 加強用戶的許可權校驗。
- 做好熱點參數的限流(sentinel)。
什麼是快取雪崩
快取雪崩是指在同一時間段大量的快取 key 同時失效或者 Redis 服務宕機,導致大量請求到達資料庫,對資料庫造成極大的壓力。
常見的解決方案有:
- 給不同的 key 的 TTL添加隨機值。
- 利用 Redis 集群提高服務的可用性。(Redis 主從,哨兵)
- 給快取業務添加降級限流策略(sentinel)。
- 給業務添加多級快取。
什麼是快取擊穿
快取擊穿也叫熱點 key 問題,是指一個被高並發訪問並且快取重建業務比較複雜的key 突然失效了,無數的請求訪問會在瞬間給資料庫帶來巨大的衝擊。
常見的解決方案有:
- 互斥鎖
- 優點:
- 沒有額外的記憶體消耗
- 保證一致性
- 失效簡單
- 缺點:
- 執行緒需要等待,性能收到影響
- 可能有死鎖的風險
- 優點:
- 邏輯過期
- 優點:
- 執行緒無需等待,性能較好
- 缺點:
- 不保證一致性
- 具有額外記憶體消耗
- 實現複雜
總結
以上就是對快取穿透、快取雪崩、快取擊穿問題的簡單介紹和解決辦法,更加具體的實現方法,正在整理中…