ProcessedIPMap map 添加时间超时概念

This commit is contained in:
2025-06-04 15:07:11 +08:00
parent ad01a368f8
commit dc5039d08d
4 changed files with 64 additions and 27 deletions

82
main.go
View File

@@ -36,8 +36,8 @@ var (
IpList = list.New() // 存储 IPv4 地址的链表
IpMutex sync.Mutex // 保护 ipList 的互斥锁
ProcessedIPMap = make(map[string]string) // 使用 map 存储已处理的 IP
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
ProcessedIPMap = map[string]time.Time{} // 使用 map 存储已处理的 IP
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
)
// 启动子进程
@@ -187,13 +187,28 @@ func loadFromFile(filePath string, logMessage string) error {
}
defer file.Close()
// 尝试用新格式解码
decoder := json.NewDecoder(file)
if err := decoder.Decode(&ProcessedIPMap); err != nil {
return fmt.Errorf("解码 Map 失败: %w", err)
temp := make(map[string]time.Time)
if err := decoder.Decode(&temp); err == nil {
ProcessedIPMap = temp
log.Println(logMessage)
return nil
}
log.Println(logMessage)
return nil
// 如果失败,尝试旧格式
file.Seek(0, 0) // 重置读取位置
decoder = json.NewDecoder(file)
oldTemp := make(map[string]string)
if err := decoder.Decode(&oldTemp); err == nil {
for ip := range oldTemp {
ProcessedIPMap[ip] = time.Now() // 给旧 IP 打个当前时间戳
}
log.Println(logMessage + "(从旧格式转换)")
return nil
}
return fmt.Errorf("解码 Map 失败: %w", err)
}
func InitMap() {
@@ -220,7 +235,7 @@ func WriteLocalAddr() {
if local_ipv4_addr != "NULL" {
//log.Printf("\033[33m %s 本机地址 \033[0m\n", ipStr)
ProcessedMutex.Lock()
ProcessedIPMap[local_ipv4_addr] = ""
ProcessedIPMap[local_ipv4_addr] = time.Now()
ProcessedMutex.Unlock()
}
// 写入json文件
@@ -287,7 +302,7 @@ func RunMainProcess() { // 主进程逻辑
// 将 IP 标记为已处理,国内地址
ProcessedMutex.Lock()
ProcessedIPMap[ipStr] = ""
ProcessedIPMap[ipStr] = time.Now()
ProcessedMutex.Unlock()
// 写入json文件
@@ -309,28 +324,45 @@ func RunMainProcess() { // 主进程逻辑
IpMutex.Unlock() // 解锁互斥锁
// 打印当前info
/*
log.Printf(" 当前Ip链表长度:%d, Ipset名:%s, 长:%d, ProcessedIPMap:[%s]当前长度:%d\n", IpList.Len(), IPSET_NAME, func() int { // 打印 当前 Ipset 链长度
_len, _err := NumIPSet(IPSET_NAME)
if _err == nil {
return _len
}
return 0
}(), ProcessedIPMap, len(ProcessedIPMap))
*/
// 清理 ProcessedIPMap
if len(ProcessedIPMap) >= 1024 {
ProcessedMutex.Lock() // 锁定互斥锁
ProcessedIPMap = make(map[string]string) // 创建一个新的空 map
ProcessedMutex.Unlock() // 解锁
log.Println("ProcessedIPMap 已清空")
}
log.Printf(" 当前Ip链表长度:%d, Ipset名:%s, 长:%d, ProcessedIPMap:[%s]当前长度:%d\n", IpList.Len(), IPSET_NAME, func() int { // 打印 当前 Ipset 链长度
_len, _err := NumIPSet(IPSET_NAME)
if _err == nil {
return _len
}
return 0
}(), ProcessedIPMap, len(ProcessedIPMap))
time.Sleep(1 * time.Second) // 防止高频运行
}
}()
// 启动一个 goroutine后台任务用于定期清理 ProcessedIPMap 中过期的 IP 条目
go func() {
for {
time.Sleep(1 * time.Minute)
// 获取当前时间,用于与 map 中的时间戳进行比较
now := time.Now()
// 加锁,确保并发安全地访问全局变量 ProcessedIPMap
ProcessedMutex.Lock()
// 遍历 ProcessedIPMap检查每个 IP 的记录是否已超过 24 小时
for ip, t := range ProcessedIPMap {
// 如果当前时间减去记录时间大于 1 小时,则删除该条目
if now.Sub(t) > 10*time.Minute {
delete(ProcessedIPMap, ip)
}
}
// 解锁,允许其他 goroutine 访问 ProcessedIPMap
ProcessedMutex.Unlock()
// 打印日志,表示本次清理已完成
log.Println("已清理过期 ProcessedIPMap 项")
}
}()
// 启动防火墙管理
go func() {
for {