Redis—問題(1)

寫在前面

Redis 是一種 NoSQL 資料庫,包含多種數據結構、支援網路、基於記憶體、可選持久性的鍵值對存儲資料庫,在我們的日常開發中會經常使用 Redis 來解決許多問題,比如排行榜、消息隊列系統、計數器 以及 快取系統等。

在作為快取使用時,不可避免的會遇到快取穿透、快取雪崩、快取擊穿(熱點 key) 的問題,那麼究竟這些問題具體值的是什麼,又該如何解決呢?

什麼是快取穿透

快取穿透是指客戶端請求的數據在快取和資料庫中都不存在,引起快取失效,並會對資料庫造成極大的壓力。
常見的解決方案有兩種:

  • 快取空對象
    • 優點:實現簡單,維護方便
    • 缺點:
      • 額外的記憶體消耗
      • 可能造成短期的不一致
  • 布隆過濾
    • 優點:記憶體佔用少,沒有多餘的key
    • 缺點:
      • 實現複雜
      • 可能存在誤判
  • 增加 id 的複雜度,避免被猜到 id 規律。
  • 做好數據的基礎格式校驗。
  • 加強用戶的許可權校驗。
  • 做好熱點參數的限流(sentinel)。

什麼是快取雪崩

快取雪崩是指在同一時間段大量的快取 key 同時失效或者 Redis 服務宕機,導致大量請求到達資料庫,對資料庫造成極大的壓力。
常見的解決方案有:

  • 給不同的 key 的 TTL添加隨機值。
  • 利用 Redis 集群提高服務的可用性。(Redis 主從,哨兵)
  • 給快取業務添加降級限流策略(sentinel)。
  • 給業務添加多級快取。

什麼是快取擊穿

快取擊穿也叫熱點 key 問題,是指一個被高並發訪問並且快取重建業務比較複雜的key 突然失效了,無數的請求訪問會在瞬間給資料庫帶來巨大的衝擊。
常見的解決方案有:

  • 互斥鎖
    • 優點:
      • 沒有額外的記憶體消耗
      • 保證一致性
      • 失效簡單
    • 缺點:
      • 執行緒需要等待,性能收到影響
      • 可能有死鎖的風險
  • 邏輯過期
    • 優點:
    • 執行緒無需等待,性能較好
    • 缺點:
      • 不保證一致性
      • 具有額外記憶體消耗
      • 實現複雜

總結

以上就是對快取穿透、快取雪崩、快取擊穿問題的簡單介紹和解決辦法,更加具體的實現方法,正在整理中…