文件存储-定时同步租户文件存储容量信息接口优化

This commit is contained in:
2025-12-29 14:42:56 +08:00
parent 36c9b61db0
commit e65bdeb229
5 changed files with 71 additions and 69 deletions

View File

@@ -22,79 +22,68 @@ type file struct{}
var File = new(file)
func (f *file) UploadFile(ctx context.Context, req *dto.UploadFileReq) (res *dto.UploadFileRes, err error) {
tenantId := ""
fileSize := req.File.Size
fileSize := gconv.Byte(req.File.Size)
totalFileSize := int64(0)
// 获取租户id
user, err := mongo.GetTenantInfo(ctx)
if err != nil {
return
}
tenantId := gconv.String(user.TenantId)
// 获取redis-租户存储容量总数key
tenantOssTotalKey := fmt.Sprintf(consts.TenantOssTotalKey, gconv.String(user.TenantId))
// 获取redis-租户存储-锁key
fileLockKey := fmt.Sprintf(consts.FileLockKey, gconv.String(user.TenantId))
i := 0
LOCK:
if ok, err := redis.RedisClient.SetNX(ctx, fileLockKey, fileSize); !ok || err != nil {
// 获取锁失败,需要重试
if i < 5 {
i++
time.Sleep(5 * time.Millisecond)
goto LOCK
}
}
// 设置redis-租户存储-锁key超时时间1分钟
err = redis.RedisClient.SetEX(ctx, fileLockKey, fileSize, gconv.Int64(time.Minute*1))
if err != nil {
return nil, err
}
// 获取redis-租户存储容量总数
get, err := redis.RedisClient.Get(ctx, tenantOssTotalKey)
if err != nil {
return nil, err
}
tenantOssTotalEntity := &entity.TenantOssTotal{}
if g.IsEmpty(get) {
//查询数据库-获取租户存储容量总数
getByTenantIdReq := &dto.GetByTenantIdReq{
TenantId: gconv.String(user.TenantId),
}
tenantOssTotal, err := TenantOssTotal.GetOneByTenantId(ctx, getByTenantIdReq)
success, err := redis.Lock(ctx, fileLockKey, gconv.Int64(time.Minute*1), func(ctx context.Context) error {
// 获取redis-租户存储容量总数
get, err := redis.RedisClient.Get(ctx, tenantOssTotalKey)
if err != nil {
return nil, err
return err
}
if g.IsEmpty(tenantOssTotal) {
tenantOssTotalEntity.TenantId = user.TenantId
tenantOssTotalEntity.UsedOssSize = int64(0)
tenantOssTotalEntity.TotalOssSize = g.Cfg().MustGet(ctx, "oss.capacitySize").Int64()
tenantOssTotalEntity := &entity.TenantOssTotal{}
if g.IsEmpty(get) {
//查询数据库-获取租户存储容量总数
getByTenantIdReq := &dto.GetByTenantIdReq{
TenantId: gconv.String(user.TenantId),
}
tenantOssTotal, err := TenantOssTotal.GetOneByTenantId(ctx, getByTenantIdReq)
if err != nil {
return err
}
if tenantOssTotal.Id.IsZero() {
tenantOssTotalEntity.TenantId = user.TenantId
tenantOssTotalEntity.UsedOssSize = int64(0)
tenantOssTotalEntity.TotalOssSize = g.Cfg().MustGet(ctx, "oss.capacitySize").Int64()
} else {
tenantOssTotalEntity = tenantOssTotal.TenantOssTotal
}
} else {
tenantOssTotalEntity = tenantOssTotal.TenantOssTotal
// 反序列化-redis获取租户存储容量总数
err = gconv.Struct(get, tenantOssTotalEntity)
if err != nil {
return err
}
}
} else {
// 反序列化-redis获取租户存储容量总数
err = gconv.Struct(get, tenantOssTotalEntity)
tenantId = gconv.String(tenantOssTotalEntity.TenantId)
fileSize = gconv.Byte(tenantOssTotalEntity.UsedOssSize) + fileSize
totalFileSize = tenantOssTotalEntity.TotalOssSize
// 设置redis-租户存储容量总数
tenantOssTotalKeyMap := map[string]interface{}{"tenantId": tenantId, "UsedOssSize": fileSize, "TotalOssSize": totalFileSize}
// 修改redis-租户存储容量总数 超时时间10分钟
err = redis.RedisClient.SetEX(ctx, tenantOssTotalKey, tenantOssTotalKeyMap, gconv.Int64(time.Minute*10))
if err != nil {
return nil, err
return err
}
}
tenantId = gconv.String(tenantOssTotalEntity.TenantId)
fileSize = tenantOssTotalEntity.UsedOssSize + fileSize
totalFileSize = tenantOssTotalEntity.TotalOssSize
// 设置redis-租户存储容量总数
tenantOssTotalKeyMap := map[string]interface{}{"tenantId": tenantId, "UsedOssSize": fileSize, "TotalOssSize": totalFileSize}
// 修改redis-租户存储容量总数 超时时间10分钟
err = redis.RedisClient.SetEX(ctx, tenantOssTotalKey, tenantOssTotalKeyMap, gconv.Int64(time.Minute*10))
if fileSize > gconv.Byte(totalFileSize) {
return gerror.New("存储服务内存不足")
}
return nil
})
if err != nil {
return nil, err
}
if fileSize < totalFileSize {
// 删除redis-租户存储-锁key
_, err = redis.RedisClient.Del(ctx, fileLockKey)
if err != nil {
return nil, err
}
} else {
if !success {
return nil, gerror.New("存储服务内存不足")
}
// 上传图片