2.0 KiB
2.0 KiB
问题分析
通过代码分析,我发现/api/top-clients端点数据无法持久化的原因有两个:
-
数据保存逻辑缺失:在
saveStatsData方法中,虽然StatsData结构体包含了ClientStats字段,但没有将server.clientStats赋值给statsData.ClientStats -
数据加载逻辑缺失:在
loadStatsData方法中,虽然StatsData结构体包含了ClientStats字段,但没有将statsData.ClientStats赋值给server.clientStats -
自动保存功能未启用:
startAutoSave方法没有在Server的Start方法中被调用,导致数据不会定期保存
修复计划
- 修改
saveStatsData方法:添加保存ClientStats数据的逻辑 - 修改
loadStatsData方法:添加加载ClientStats数据的逻辑 - 在
Server.Start方法中调用startAutoSave:确保数据定期保存
修复步骤
步骤1:修改saveStatsData方法
在dns/server.go文件中,修改saveStatsData方法,添加保存ClientStats数据的逻辑:
// 复制客户端统计数据
s.clientStatsMutex.RLock()
statsData.ClientStats = make(map[string]*ClientStats)
for k, v := range s.clientStats {
statsData.ClientStats[k] = v
}
s.clientStatsMutex.RUnlock()
步骤2:修改loadStatsData方法
在dns/server.go文件中,修改loadStatsData方法,添加加载ClientStats数据的逻辑:
s.clientStatsMutex.Lock()
if statsData.ClientStats != nil {
s.clientStats = statsData.ClientStats
}
s.clientStatsMutex.Unlock()
步骤3:在Server.Start方法中调用startAutoSave
在dns/server.go文件的Start方法中,添加调用startAutoSave的代码:
// 启动自动保存功能
go s.startAutoSave()
预期效果
修复后,/api/top-clients端点的数据将:
- 在服务器启动时从文件加载
- 定期自动保存到文件
- 在服务器停止时最后保存一次
这样就能确保/api/top-clients端点的数据持久化,不会因为服务器重启而丢失。