数据结构优化

This commit is contained in:
李琦
2026-01-20 11:00:42 +08:00
parent 29a642c285
commit b088ba48be
17 changed files with 1073 additions and 49 deletions

View File

@@ -13,6 +13,7 @@ import (
var (
searcher *xdb.Searcher
once sync.Once
mu sync.RWMutex // 保护 searcher 的并发访问
)
// InitIP2Region 初始化 ip2region
@@ -52,7 +53,9 @@ func InitIP2Region(dbPath string) {
// 如果最终路径为空,说明找不到文件
if finalPath == "" {
log.Printf("IP2Region database file not found. Region lookup will be disabled.")
mu.Lock()
searcher = nil
mu.Unlock()
return
}
@@ -60,16 +63,26 @@ func InitIP2Region(dbPath string) {
cBuff, err := xdb.LoadContentFromFile(finalPath)
if err != nil {
log.Printf("Failed to load ip2region.xdb from %s: %v. Region lookup will be disabled.", finalPath, err)
mu.Lock()
searcher = nil
mu.Unlock()
return
}
searcher, err = xdb.NewWithBuffer(nil, cBuff)
newSearcher, err := xdb.NewWithBuffer(nil, cBuff)
if err != nil {
log.Printf("Failed to create searcher: %v", err)
mu.Lock()
searcher = nil
mu.Unlock()
return
}
// 使用写锁设置 searcher
mu.Lock()
searcher = newSearcher
mu.Unlock()
log.Printf("IP2Region loaded successfully from %s", finalPath)
})
}
@@ -84,7 +97,13 @@ func GetRegion(ip string) string {
}
}()
if searcher == nil {
// 使用读锁保护并发访问
mu.RLock()
s := searcher
mu.RUnlock()
// 再次检查 searcher 是否为 nil
if s == nil {
return "Unknown"
}
@@ -93,8 +112,25 @@ func GetRegion(ip string) string {
return "Internal"
}
region, err := searcher.SearchByStr(ip)
// 再次检查 searcher 是否为 nil防止在检查后、调用前被设置为 nil
mu.RLock()
s = searcher
mu.RUnlock()
if s == nil {
return "Unknown"
}
// 使用 defer recover 保护 SearchByStr 调用
defer func() {
if r := recover(); r != nil {
log.Printf("Panic in searcher.SearchByStr for IP %s: %v", ip, r)
}
}()
region, err := s.SearchByStr(ip)
if err != nil {
log.Printf("Error searching region for IP %s: %v", ip, err)
return "Unknown"
}
return region