optimize the circuit diagram loading function

This commit is contained in:
douxu 2024-11-18 16:41:11 +08:00
parent 148ab704df
commit c4965bed32
9 changed files with 54 additions and 25 deletions

View File

@ -1,13 +1,9 @@
package config package config
import ( import (
"sync"
"modelRT/orm" "modelRT/orm"
) )
type ModelParseConfig struct { type ModelParseConfig struct {
CircuitDiagramID int64
CircuitDiagramInfos []orm.CircuitDiagram CircuitDiagramInfos []orm.CircuitDiagram
CircuitDiagramMap *sync.Map
} }

View File

@ -4,7 +4,6 @@ package database
import ( import (
"context" "context"
"strconv" "strconv"
"sync"
"time" "time"
"modelRT/config" "modelRT/config"
@ -15,7 +14,7 @@ import (
) )
// LoadCircuitDiagramFromPostgresDB return the result of query circuit diagram info from postgresDB // LoadCircuitDiagramFromPostgresDB return the result of query circuit diagram info from postgresDB
func LoadCircuitDiagramFromPostgresDB(ctx context.Context, pool *ants.PoolWithFunc, circuitDiagramsMap *sync.Map, logger *zap.Logger) error { func LoadCircuitDiagramFromPostgresDB(ctx context.Context, pool *ants.PoolWithFunc, logger *zap.Logger) error {
var circuitDiagramOverviews []orm.CircuitDiagramOverview var circuitDiagramOverviews []orm.CircuitDiagramOverview
// ctx超时判断 // ctx超时判断
cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second) cancelCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
@ -37,9 +36,7 @@ func LoadCircuitDiagramFromPostgresDB(ctx context.Context, pool *ants.PoolWithFu
return result.Error return result.Error
} }
pool.Invoke(config.ModelParseConfig{ pool.Invoke(config.ModelParseConfig{
CircuitDiagramID: overview.ID,
CircuitDiagramInfos: circuitDiagramInfos, CircuitDiagramInfos: circuitDiagramInfos,
CircuitDiagramMap: circuitDiagramsMap,
}) })
} }
return nil return nil

View File

@ -0,0 +1,23 @@
package diagram
import (
"errors"
"sync"
cmap "github.com/orcaman/concurrent-map/v2"
)
var DiagramsOverview sync.Map
func GetCircuitDiagramMap(key string) (*cmap.ConcurrentMap[string, any], error) {
value, ok := DiagramsOverview.Load(key)
if !ok {
newMap := cmap.New[any]()
return &newMap, nil
}
paramsMap, ok := value.(*cmap.ConcurrentMap[string, any])
if !ok {
return nil, errors.New("")
}
return paramsMap, nil
}

View File

@ -7,6 +7,7 @@ require (
github.com/gofrs/uuid v4.4.0+incompatible github.com/gofrs/uuid v4.4.0+incompatible
github.com/json-iterator/go v1.1.12 github.com/json-iterator/go v1.1.12
github.com/natefinch/lumberjack v2.0.0+incompatible github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/orcaman/concurrent-map/v2 v2.0.1
github.com/panjf2000/ants/v2 v2.10.0 github.com/panjf2000/ants/v2 v2.10.0
github.com/spf13/viper v1.19.0 github.com/spf13/viper v1.19.0
go.uber.org/zap v1.27.0 go.uber.org/zap v1.27.0

View File

@ -76,6 +76,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8=
github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=

View File

@ -13,4 +13,8 @@ func ModelLoad(ctx *gin.Context) {
ctx.Writer.Write([]byte("Hi Boy")) ctx.Writer.Write([]byte("Hi Boy"))
pgClient := database.GetPostgresDBInstance(ctx, "") pgClient := database.GetPostgresDBInstance(ctx, "")
fmt.Println(pgClient) fmt.Println(pgClient)
// TODO
// step1 查询电路具体信息表 circuit_diagram_xxx获取所有 uuid
// step2 根据 uuid 获取所有的电路图map 结构
// step3 json化相关数据并返回结果
} }

View File

@ -4,7 +4,6 @@ package main
import ( import (
"context" "context"
"flag" "flag"
"sync"
"time" "time"
"modelRT/config" "modelRT/config"
@ -33,10 +32,9 @@ var (
) )
var ( var (
modelRTConfig config.ModelRTConfig modelRTConfig config.ModelRTConfig
postgresDBClient *gorm.DB postgresDBClient *gorm.DB
logger *zap.Logger logger *zap.Logger
circuitDiagramMap sync.Map
) )
// TODO 使用 wire 依赖注入 // TODO 使用 wire 依赖注入
@ -68,7 +66,7 @@ func main() {
defer ants.Release() defer ants.Release()
// load circuit diagram from postgres // load circuit diagram from postgres
err = database.LoadCircuitDiagramFromPostgresDB(ctx, pool, &circuitDiagramMap, logger) err = database.LoadCircuitDiagramFromPostgresDB(ctx, pool, logger)
if err != nil { if err != nil {
logger.Error("load circuit diagrams from postgres failed", zap.Error(err)) logger.Error("load circuit diagrams from postgres failed", zap.Error(err))
panic(err) panic(err)

View File

@ -1,7 +1,10 @@
package model package model
import ( import (
"errors"
"modelRT/config" "modelRT/config"
"modelRT/diagram"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
@ -14,20 +17,27 @@ var ParseFunc = func(parseConfig interface{}) {
modelParseConfig, ok := parseConfig.(config.ModelParseConfig) modelParseConfig, ok := parseConfig.(config.ModelParseConfig)
if !ok { if !ok {
logger.Error("conversion model parse config type failed") logger.Error("conversion model parse config type failed")
return panic(errors.New("conversion model parse config type failed"))
} }
for _, circuitDiagram := range modelParseConfig.CircuitDiagramInfos { for _, circuitDiagram := range modelParseConfig.CircuitDiagramInfos {
parseStruct := SelectModelByType(circuitDiagram.Type) overviewKey := circuitDiagram.UUID
err := jsoniter.Unmarshal([]byte(circuitDiagram.OtherParams), parseStruct) unmarshalMap, err := diagram.GetCircuitDiagramMap(overviewKey)
if err != nil {
logger.Error("get circuit diagram map from overviewMap failed", zap.String("circuit_diagram_overview_key", overviewKey), zap.Error(err))
panic(err)
}
err = jsoniter.Unmarshal([]byte(circuitDiagram.OtherParams), unmarshalMap)
if err != nil { if err != nil {
logger.Error("parsing circuit diagram params failed", zap.Int64("circuit_diagram_id", circuitDiagram.ID), zap.Error(err)) logger.Error("parsing circuit diagram params failed", zap.Int64("circuit_diagram_id", circuitDiagram.ID), zap.Error(err))
panic(err) panic(err)
} }
// TODO 利用多叉树结构存储解析后的电路图 unmarshalMap.Set("id", circuitDiagram.ID)
unmarshalMap.Set("parent_id", circuitDiagram.ParentID)
unmarshalMap.Set("type", circuitDiagram.Type)
unmarshalMap.Set("created_time", circuitDiagram.CreatedTime)
unmarshalMap.Set("updated_time", circuitDiagram.UpdateTime)
} }
key := modelParseConfig.CircuitDiagramID
// TODO 形成 key-多叉树结构
modelParseConfig.CircuitDiagramMap.Store(key, nil)
return return
} }

View File

@ -1,14 +1,12 @@
// Package orm define database data struct // Package orm define database data struct
package orm package orm
import "time"
type CircuitDiagram struct { type CircuitDiagram struct {
ID int64 `gorm:""` ID int64 `gorm:""`
ParentID int64 ParentID int64
Type int Type int
UUID string UUID string
OtherParams string OtherParams string
CreatedTime time.Time CreatedTime int64
UpdateTime time.Time UpdateTime int64
} }