1 Redis—問題

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

    推薦閱讀