目錄
- 一、引入前提
- 二、緩存架構的設計要點
- 2.1、緩存穿透
- 2.1.1、緩存穿透第一種情況:存儲數據不存在
- 2.1.2、緩存穿透第二種情況:緩存數據生成耗費大量時間或者資源
- 2.2、緩存雪崩
- 2.2.1、解決緩存雪崩的第一種方法:更新鎖機制
- 2.2.2、解決緩存雪崩的第二種方法:后臺更新機制
- 2.3、緩存熱點
- 2.3.1、緩存熱點的解決方法
- 三、緩存架構的實現方式
本文來源:極客時間vip課程筆記
一、引入前提
-
雖然我們可以通過各種手段來提升存儲系統的性能,但在某些復雜的業務場景下,單純依靠存儲系統的性能提升不夠的,典型的場景有:
-
經過復雜運算后得出的數據,存儲系統無能為力
例如,一個論壇需要在首頁展示當前有多少用戶同時在線,如果使用 MySQL 來存儲當前用戶狀態,則每次獲取這個總數都要“count(*)”大量數據,這樣的操作無論怎么優化 MySQL,性能都不會太高。如果要實時展示用戶同時在線數,則 MySQL 性能無法支撐。
-
讀多寫少的數據,存儲系統有心無力
例如,一個明星發一條微博,可能幾千萬人來瀏覽。如果使用 MySQL 來存儲微博,用戶寫微博只有一條 insert 語句,但每個用戶瀏覽時都要 select 一次,即使有索引,幾千萬條 select 語句對 MySQL 數據庫的壓力也會非常大
-
緩存就是為了彌補存儲系統在這些復雜業務場景下的不足,其基本原理是將可能重復使用的數據放到內存中,一次生成、多次使用,避免每次使用都去訪問存儲系統。
-
緩存能夠帶來性能的大幅提升,以 Memcache 為例,單臺 Memcache 服務器簡單的 key-value 查詢能夠達到 TPS 50000 以上,其基本的架構是:
-
緩存雖然能夠大大減輕存儲系統的壓力,但同時也給架構引入了更多復雜性。架構設計時如果沒有針對緩存的復雜性進行處理,某些場景下甚至會導致整個系統崩潰。
二、緩存架構的設計要點
2.1、緩存穿透
- 緩存穿透