package timer import ( "context" "yunyan/comm" redissys "yunyan/lego/sys/redis" "yunyan/modules" "fmt" "time" "yunyan/lego/base" "yunyan/lego/core" "yunyan/lego/sys/cron" ) type uselogTimer struct { modules.MCompHttpGate service base.IRPCXService module *Timer options *Options } func (this *uselogTimer) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { this.MCompHttpGate.Init(service, module, comp, options) this.service = service.(base.IRPCXService) this.module = module.(*Timer) this.options = options.(*Options) return } func (this *uselogTimer) Start() (err error) { err = this.MCompHttpGate.Start() //凌晨1分1秒执行 cron.AddFunc("1 1 0 * * ?", this.timer) return } func (this *uselogTimer) timer() { fmt.Println("开始读取 log:* 数据...", time.Now().Format("15:04:05")) ctx := context.Background() // 使用 SCAN 而非 KEYS(更安全) var ( cursor uint64 datas []map[string]string = make([]map[string]string, 0) ) for { keys, newCursor, err := redissys.Conn().Scan(ctx, cursor, redissys.RKey(fmt.Sprintf("%s:*", comm.TableUseRecordLog)), 100).Result() if err != nil { fmt.Println("Scan error:", err) break } for _, key := range keys { data, err := redissys.Conn().HGetAll(ctx, key).Result() if err != nil { fmt.Println("HGETALL error:", err) continue } datas = append(datas, data) // ✅ 这里处理数据,比如打印 / 存储到 DB fmt.Printf("处理 %s: %+v\n", key, data) // 删除日志 key if err := redissys.Conn().Del(ctx, key).Err(); err != nil { fmt.Println("DEL error:", err) } else { fmt.Printf("已删除 %s\n", key) } } if newCursor == 0 { break } cursor = newCursor } fmt.Println("日志处理完成。") }