l-export-async/README.md

95 lines
3.6 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.

## 安装
```bash
$ go get gitea.cdlsxd.cn/self-tools/l-export-async
```
## 使用
```go
task, err := export_async.NewExportAsync(
fmt.Sprintf("%s%s", "分销商账户-交易明细", time.Now().Format("20060102150405")),
s.balanceLogsFiled(),
s.cfg.Rpc.GetAttachmentDomain(),
export_async.NewRedisTaskStore(s.d.Rdb),
export_async.WithCustomBatchSize(10000),
export_async.WithCustomBatchSize(10000),
export_async.WithCursor(func(ctx context.Context, cursor interface{}, limit int) ([][]interface{}, interface{}, error) {
req.Page = &api.PageReq{
Page: 1,
PageSize: int32(limit),
}
req.Id = uint64(cursor.(int32))
resp, err := s.BalanceLogs(ctx, req)
if len(resp.Data) == 0 {
return nil, nil, nil
}
last := resp.Data[len(resp.Data)-1].Id
return s.balanceLogsToCollect(resp.Data), last, err
}, idMax),
export_async.WithLogPrint(s.log),
export_async.WithMaxRowPerFile(1000000),
).Run(ctx)
if err != nil {
return nil, myerr.ErrorParamError("导出失败,请稍后重试:" + err.Error())
}
return &api.TaskReply{Task: task}, nil
```
## 主要功能
1. 异步导出任务管理
- 使用 context.Context 支持上下文取消和超时控制。
- 通过 Task 结构体跟踪任务状态ID、进度、错误信息、数据量等
- 支持任务进度更新和持久化存储(通过 TaskSaveTool 接口)。
****
2. 并发处理
- CSV 导出:将数据分页写入多个 CSV 文件。
- Excel (XLSX) 导出:将多个 CSV 文件合并为多个 Excel 文件(支持流式处理,避免内存溢出)。
- ZIP 打包:将生成的 Excel 文件打包为 ZIP 文件。
****
3. 数据分页与批量处理
- 支持分页查询数据batchSize 控制每页大小)
- 支持限制每个 Excel 文件的最大行数maxRowPerFile
- 支持 CSV 转 Excel 时的批量写入缓冲区大小csvToExcelBatch
****
4. 文件上传
- 支持将生成的 ZIP 文件上传到指定服务器(通过 Uploader 配置)。
- 上传后生成可访问的 URL通过 GeneratePreviewPrivateUrl 生成预览链接)。
****
5. 日志记录
- 通过 LogTool 接口记录任务执行过程中的日志(如进度、错误信息等)。
****
6. 临时文件管理
- 自动创建临时目录(/csv/、/xlsx/、/zip/)并清理。
- 支持自定义文件扩展名extension、Sheet 名称sheetName等。
****
7. 可扩展性
- 通过 ExportOption 函数式选项模式支持灵活配置(如自定义上传器、日志工具、工作协程数等)。
- 通过接口DataProviderFn、TaskSaveTool、LogTool支持自定义实现。
## 亮点
1. 高性能与低内存占用
- 使用流式处理csv.Writer 和 zip.Writer避免一次性加载所有数据到内存。
- 通过分页查询和并发处理减少数据库压力。
- 使用 sync.Pool 复用 ExportAsync 实例,减少内存分配。
****
2. 进度跟踪与任务状态管理
- 支持任务状态持久化(如存储到 Redis方便前端查询进度
****
3. 灵活的配置
- 支持通过函数式选项ExportOption动态配置导出任务如自定义上传器、日志工具、工作协程数等
- 默认配置合理(如 batchSize=10000、maxRowPerFile=10000同时支持覆盖。
****
4. 支持大数据量导出
- 通过分页和并发处理支持导出千万级数据。
- 支持限制每个 Excel 文件的行数,避免单个文件过大。
****
## 适用场景
- 需要导出大量数据(如报表、日志、用户数据等)到 Excel 或 CSV 的场景。
- 需要支持异步导出(避免阻塞主流程)的场景。
- 需要将导出的文件上传到服务器(如 OSS、FTP 等)的场景。
- 需要进度跟踪和任务状态管理的场景。