Cache Statistics (recordStats) 使用指南

概述

已啟用 Caffeine 緩存統計功能,可以監控緩存的性能指標。

配置說明

application.properties

spring.cache.type=caffeine
spring.cache.caffeine.spec=maximumSize=28000,expireAfterWrite=1d,recordStats
  • recordStats: 啟用統計記錄功能
  • 會輕微影響性能(約 5-10%),但提供寶貴的監控數據

API 端點

1. 查詢單個緩存統計

GET /CacheStats/getCacheStats?cacheName=apimAuthKeys

響應示例:

{
  "cacheName": "apimAuthKeys",
  "hitCount": 150,
  "missCount": 10,
  "hitRate": "93.75%",
  "missRate": "6.25%",
  "requestCount": 160,
  "loadSuccessCount": 10,
  "loadFailureCount": 0,
  "totalLoadTime": 5000000000,
  "averageLoadPenalty": 500000000,
  "evictionCount": 2,
  "estimatedSize": 8
}

2. 查詢所有緩存統計

GET /CacheStats/getAllCacheStats

響應示例:

{
  "apimAuthKeys": {
    "cacheName": "apimAuthKeys",
    "hitCount": 150,
    ...
  }
}

統計指標說明

指標 說明
hitCount 緩存命中次數
missCount 緩存未命中次數
hitRate 命中率百分比
missRate 未命中率百分比
requestCount 總請求次數 (hit + miss)
loadSuccessCount 成功加載次數
loadFailureCount 加載失敗次數
totalLoadTime 總加載時間(納秒)
averageLoadPenalty 平均加載時間(納秒)
evictionCount 驅逐次數
estimatedSize 當前緩存條目數

使用場景

1. 性能監控

定期查詢統計數據,監控緩存效能:

curl http://localhost:8080/CacheStats/getCacheStats?cacheName=apimAuthKeys

2. 調優參考

  • 低命中率 (<80%): 考慮增加 TTL 或調整業務邏輯
  • 高驅逐率: 考慮增加 maximumSize
  • 高平均加載時間: Key Vault 訪問可能有性能問題

3. 容量規劃

  • 監控 estimatedSizemaximumSize 的比例
  • 如果經常達到上限並驅逐,考慮擴容

集成監控系統

Prometheus/Grafana

可以定期調用 API 並導出指標到監控系統:

// 示例:定時任務導出統計
@Scheduled(fixedRate = 60000) // 每分鐘
public void exportCacheMetrics() {
    Map<String, Object> stats = cacheStatsController.getAllCacheStats();
    // 推送到 Prometheus Pushgateway 或其他監控系統
}

注意事項

  1. 性能影響: recordStats 會有輕微性能開銷,生產環境可接受
  2. 統計重置: 應用重啟後統計數據會重置
  3. 線程安全: Caffeine 的統計是線程安全的
  4. 實時性: 統計數據是實時更新的

故障排查

問題:統計數據全為 0

  • 確認 recordStats 已在配置中啟用
  • 確認緩存已被使用(至少調用過一次)

問題:命中率異常低

  • 檢查 cache key 是否正確(使用 CacheConstants
  • 檢查 TTL 是否過短導致頻繁過期
  • 檢查是否有頻繁的 @CacheEvict 操作

相關代碼

  • 配置常量:com.wpg.config.CacheConstants
  • 統計 API:com.wpg.controller.CacheStatsController
  • 緩存服務:com.wpg.service.ConnectUrlService.getApimAuthKey()
  • 手動刷新:com.wpg.controller.CreditController.refreshApimAuthKey()