diff --git a/market/data.go b/market/data.go index 5d04a67c..a4b2c475 100644 --- a/market/data.go +++ b/market/data.go @@ -8,6 +8,20 @@ import ( "net/http" "strconv" "strings" + "sync" + "time" +) + +// FundingRateCache 资金费率缓存结构 +// Binance Funding Rate 每 8 小时才更新一次,使用 1 小时缓存可显著减少 API 调用 +type FundingRateCache struct { + Rate float64 + UpdatedAt time.Time +} + +var ( + fundingRateMap sync.Map // map[string]*FundingRateCache + frCacheTTL = 1 * time.Hour ) // Get 获取指定代币的市场数据 @@ -322,8 +336,19 @@ func getOpenInterestData(symbol string) (*OIData, error) { }, nil } -// getFundingRate 获取资金费率 +// getFundingRate 获取资金费率(优化:使用 1 小时缓存) func getFundingRate(symbol string) (float64, error) { + // 检查缓存(有效期 1 小时) + // Funding Rate 每 8 小时才更新,1 小时缓存非常合理 + if cached, ok := fundingRateMap.Load(symbol); ok { + cache := cached.(*FundingRateCache) + if time.Since(cache.UpdatedAt) < frCacheTTL { + // 缓存命中,直接返回 + return cache.Rate, nil + } + } + + // 缓存过期或不存在,调用 API url := fmt.Sprintf("https://fapi.binance.com/fapi/v1/premiumIndex?symbol=%s", symbol) resp, err := http.Get(url) @@ -352,6 +377,13 @@ func getFundingRate(symbol string) (float64, error) { } rate, _ := strconv.ParseFloat(result.LastFundingRate, 64) + + // 更新缓存 + fundingRateMap.Store(symbol, &FundingRateCache{ + Rate: rate, + UpdatedAt: time.Now(), + }) + return rate, nil }