95 lines
3.6 KiB
Markdown
95 lines
3.6 KiB
Markdown
## 安装
|
||
|
||
```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 等)的场景。
|
||
- 需要进度跟踪和任务状态管理的场景。 |