應用快取預熱方案設計

語言: CN / TW / HK

背景

隨著業務的發展,微服務越來越多,快取相關的場景也比較多,通常的做法是基於快取資料庫(如redis),client來進行快取操作。這樣的問題有兩個

  1. 如果更換快取資料庫改造成本比較高

  2. 對於批量查快取、快取穿透等場景沒有統一實現,邏輯分散

所以需要一個統一的快取框架。

另外針對一些活動、大促場景需要對快取資料進行預熱。所以需要設計一套通用的預熱系統。所謂預熱,其實就是提前請求資料,使快取生效。快取和預熱有關聯,但是可以設計成獨立的兩套系統。

快取框架

目標是實現

  1. 去除樣板程式碼

getDataWithCache(Long id) {
val data = getFromCache(id);
// 快取沒有,從資料庫中拿
if (data == null) {
data = getFromDb(id);
putDataInfoCache();
}
}
  1. 遮蔽掉快取的具體實現,快取有本地快取(guava cache),分散式快取(redis,memcache),實現方式不同,但是對於業務無需感知

  2. 支援快取穿透、快取擊穿、級聯快取、批量查詢快取場景

  3. 能夠監控到快取命中率

實現分析

在這裡插入圖片描述

API 層

提供一些annotation給開發者使用

解析層

解析annotation,生成對應的快取操作API

快取操作SPI

遮蔽掉具體的快取資料庫實現

快取操作層

具體的快取資料庫實現,如redis,memcache

開源的實現

http://docs.spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/cache.html

目前有spring-cache的實現,大部分需要的功能都能提供,不過也存在一些劣勢

  1. 不支援多級快取,批量查詢快取

  2. 和公司內部的監控,全鏈路trace沒有打通。

所以通常可以借鑑spring-cache思路,結合公司的基礎元件,自研一套。具體實現邏輯見github

預熱系統

預熱系統其實就是三步

  1. 構造資料 支援excel,離線表,等多種資料匯出成特定格式的引數

  2. 提交任務 提交呼叫待預熱介面的方法,有個任務中心即可

  3. 執行 任務中心的任務排程

所以主要是搭建一個數據構造模組,再基於公司已有的任務執行中心即可實現。