// Package cache 定义任务状态缓存接口,支持 Redis 实时状态 + 内存降级。 // Redis 不可用时降级到 NoopCache,任务系统仍可运行(仅失去实时状态能力,回退到 SQLite)。 package cache import ( "context" "time" ) // TaskType 任务类型。 type TaskType string const ( TaskTypeFull TaskType = "full" // 全量入库 TaskTypeIncremental TaskType = "incremental" // 增量同步 ) // TaskStatus 任务状态。 type TaskStatus string const ( TaskStatusPending TaskStatus = "pending" // 已创建未启动 TaskStatusRunning TaskStatus = "running" // 执行中 TaskStatusSuccess TaskStatus = "success" // 成功 TaskStatusFailed TaskStatus = "failed" // 失败 TaskStatusCancelled TaskStatus = "cancelled" // 已取消 ) // Task 任务运行态快照,Redis 实时状态与 SQLite 持久化共用同一结构。 type Task struct { ID string `json:"id"` Type TaskType `json:"type"` Status TaskStatus `json:"status"` Total int `json:"total"` Done int `json:"done"` Success int `json:"success"` Failed int `json:"failed"` FailedCodes []string `json:"failedCodes,omitempty"` Params string `json:"params"` Error string `json:"error,omitempty"` StartedAt string `json:"startedAt"` FinishedAt string `json:"finishedAt,omitempty"` } // Cache 任务状态缓存接口。 // Redis 实现用于实时状态查询;NoopCache 用于 Redis 不可用时降级。 type Cache interface { // GetTask 读取任务状态,不存在返回 nil,nil。 GetTask(ctx context.Context, id string) (*Task, error) // SetTask 写入任务状态,ttl 为过期时间。 SetTask(ctx context.Context, t *Task, ttl time.Duration) error // DeleteTask 删除任务状态。 DeleteTask(ctx context.Context, id string) error // ListActiveTaskIDs 返回运行中任务的 ID 列表。 ListActiveTaskIDs(ctx context.Context) ([]string, error) // AddActiveTask 将任务 ID 加入活跃集合。 AddActiveTask(ctx context.Context, id string) error // RemoveActiveTask 从活跃集合移除任务 ID。 RemoveActiveTask(ctx context.Context, id string) error // Ping 探测缓存可用性。 Ping(ctx context.Context) error } // NoopCache Cache 的空实现,Redis 不可用时降级使用。 // 所有操作均为空操作,任务状态仅依赖 SQLite 持久化。 type NoopCache struct{} func (NoopCache) GetTask(ctx context.Context, id string) (*Task, error) { return nil, nil } func (NoopCache) SetTask(ctx context.Context, t *Task, ttl time.Duration) error { return nil } func (NoopCache) DeleteTask(ctx context.Context, id string) error { return nil } func (NoopCache) ListActiveTaskIDs(ctx context.Context) ([]string, error) { return nil, nil } func (NoopCache) AddActiveTask(ctx context.Context, id string) error { return nil } func (NoopCache) RemoveActiveTask(ctx context.Context, id string) error { return nil } func (NoopCache) Ping(ctx context.Context) error { return nil }