Files
dns-server/.trae/documents/修复_api_top-clients端点数据持久化问题.md
2025-11-28 17:59:13 +08:00

58 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 问题分析
通过代码分析,我发现/api/top-clients端点数据无法持久化的原因有两个
1. **数据保存逻辑缺失**:在`saveStatsData`方法中,虽然`StatsData`结构体包含了`ClientStats`字段,但没有将`server.clientStats`赋值给`statsData.ClientStats`
2. **数据加载逻辑缺失**:在`loadStatsData`方法中,虽然`StatsData`结构体包含了`ClientStats`字段,但没有将`statsData.ClientStats`赋值给`server.clientStats`
3. **自动保存功能未启用**`startAutoSave`方法没有在`Server``Start`方法中被调用,导致数据不会定期保存
## 修复计划
1. **修改`saveStatsData`方法**:添加保存`ClientStats`数据的逻辑
2. **修改`loadStatsData`方法**:添加加载`ClientStats`数据的逻辑
3. **在`Server.Start`方法中调用`startAutoSave`**:确保数据定期保存
## 修复步骤
### 步骤1修改`saveStatsData`方法
`dns/server.go`文件中,修改`saveStatsData`方法,添加保存`ClientStats`数据的逻辑:
```go
// 复制客户端统计数据
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`数据的逻辑:
```go
s.clientStatsMutex.Lock()
if statsData.ClientStats != nil {
s.clientStats = statsData.ClientStats
}
s.clientStatsMutex.Unlock()
```
### 步骤3在`Server.Start`方法中调用`startAutoSave`
`dns/server.go`文件的`Start`方法中,添加调用`startAutoSave`的代码:
```go
// 启动自动保存功能
go s.startAutoSave()
```
## 预期效果
修复后,/api/top-clients端点的数据将
1. 在服务器启动时从文件加载
2. 定期自动保存到文件
3. 在服务器停止时最后保存一次
这样就能确保/api/top-clients端点的数据持久化不会因为服务器重启而丢失。