fix: 请求的缓存结果移动并复用

This commit is contained in:
spiritlhl 2025-04-11 14:15:20 +00:00
parent 0c7727e3dc
commit 211c724509
3 changed files with 24 additions and 27 deletions

View File

@ -8,6 +8,13 @@ import (
) )
func BackTrace(enableIpv6 bool) { func BackTrace(enableIpv6 bool) {
if model.CachedIcmpData == "" || model.ParsedIcmpTargets == nil || time.Since(model.CachedIcmpDataFetchTime) > time.Hour {
model.CachedIcmpData = getData(model.IcmpTargets)
model.CachedIcmpDataFetchTime = time.Now()
if model.CachedIcmpData != "" {
model.ParsedIcmpTargets = parseIcmpTargets(model.CachedIcmpData)
}
}
if enableIpv6 { if enableIpv6 {
ipv4Count := len(model.Ipv4s) ipv4Count := len(model.Ipv4s)
ipv6Count := len(model.Ipv6s) ipv6Count := len(model.Ipv6s)

View File

@ -17,19 +17,6 @@ type Result struct {
s string s string
} }
// IcmpTarget 定义ICMP目标的JSON结构
type IcmpTarget struct {
Province string `json:"province"`
ISP string `json:"isp"`
IPVersion string `json:"ip_version"`
IPs string `json:"ips"` // IP列表以逗号分隔
}
// 用于缓存ICMP数据的全局变量
var cachedIcmpData string
var cachedIcmpDataFetchTime time.Time
var parsedIcmpTargets []IcmpTarget
func removeDuplicates(elements []string) []string { func removeDuplicates(elements []string) []string {
encountered := map[string]bool{} // 用于存储已经遇到的元素 encountered := map[string]bool{} // 用于存储已经遇到的元素
result := []string{} // 存储去重后的结果 result := []string{} // 存储去重后的结果
@ -80,14 +67,14 @@ func getData(endpoint string) string {
} }
// parseIcmpTargets 解析ICMP目标数据 // parseIcmpTargets 解析ICMP目标数据
func parseIcmpTargets(jsonData string) []IcmpTarget { func parseIcmpTargets(jsonData string) []model.IcmpTarget {
// 确保JSON数据格式正确如果返回的是数组需要添加[和] // 确保JSON数据格式正确如果返回的是数组需要添加[和]
if !strings.HasPrefix(jsonData, "[") { if !strings.HasPrefix(jsonData, "[") {
jsonData = "[" + jsonData + "]" jsonData = "[" + jsonData + "]"
} }
// 如果JSON数据中的对象没有正确用逗号分隔修复它 // 如果JSON数据中的对象没有正确用逗号分隔修复它
jsonData = strings.ReplaceAll(jsonData, "}{", "},{") jsonData = strings.ReplaceAll(jsonData, "}{", "},{")
var targets []IcmpTarget var targets []model.IcmpTarget
err := json.Unmarshal([]byte(jsonData), &targets) err := json.Unmarshal([]byte(jsonData), &targets)
if err != nil { if err != nil {
if model.EnableLoger { if model.EnableLoger {
@ -100,17 +87,7 @@ func parseIcmpTargets(jsonData string) []IcmpTarget {
// tryAlternativeIPs 从IcmpTargets获取备选IP地址 // tryAlternativeIPs 从IcmpTargets获取备选IP地址
func tryAlternativeIPs(targetName string, ipVersion string) []string { func tryAlternativeIPs(targetName string, ipVersion string) []string {
if cachedIcmpData == "" || parsedIcmpTargets == nil || time.Since(cachedIcmpDataFetchTime) > time.Hour { if model.ParsedIcmpTargets == nil || (model.ParsedIcmpTargets != nil && len(model.ParsedIcmpTargets) == 0) {
cachedIcmpData = getData(model.IcmpTargets)
cachedIcmpDataFetchTime = time.Now()
if cachedIcmpData != "" {
parsedIcmpTargets = parseIcmpTargets(cachedIcmpData)
}
if model.EnableLoger {
Logger.Info("Fetched new ICMP targets data")
}
}
if parsedIcmpTargets == nil || len(parsedIcmpTargets) == 0 {
return nil return nil
} }
// 从目标名称中提取省份和ISP信息 // 从目标名称中提取省份和ISP信息
@ -137,7 +114,7 @@ func tryAlternativeIPs(targetName string, ipVersion string) []string {
} }
// 查找匹配条件的目标 // 查找匹配条件的目标
var result []string var result []string
for _, target := range parsedIcmpTargets { for _, target := range model.ParsedIcmpTargets {
// 检查省份是否匹配(可能带有"省"字或不带) // 检查省份是否匹配(可能带有"省"字或不带)
provinceMatch := (target.Province == targetProvince) || (target.Province == targetProvince+"省") provinceMatch := (target.Province == targetProvince) || (target.Province == targetProvince+"省")
// 检查ISP和IP版本是否匹配 // 检查ISP和IP版本是否匹配

View File

@ -1,9 +1,19 @@
package model package model
import "time"
const BackTraceVersion = "v0.0.5" const BackTraceVersion = "v0.0.5"
var EnableLoger = false var EnableLoger = false
// IcmpTarget 定义ICMP目标的JSON结构
type IcmpTarget struct {
Province string `json:"province"`
ISP string `json:"isp"`
IPVersion string `json:"ip_version"`
IPs string `json:"ips"` // IP列表以逗号分隔
}
var ( var (
IcmpTargets = "https://raw.githubusercontent.com/spiritLHLS/icmp_targets/refs/heads/main/nodes.json" IcmpTargets = "https://raw.githubusercontent.com/spiritLHLS/icmp_targets/refs/heads/main/nodes.json"
CdnList = []string{ CdnList = []string{
@ -62,4 +72,7 @@ var (
"AS9808": "移动CMI [普通线路]", "AS9808": "移动CMI [普通线路]",
"AS58453": "移动CMI [普通线路]", "AS58453": "移动CMI [普通线路]",
} }
CachedIcmpData string
CachedIcmpDataFetchTime time.Time
ParsedIcmpTargets []IcmpTarget
) )