From 1cf6137f9fc6fe5c01da58850d990b36a3a333e1 Mon Sep 17 00:00:00 2001 From: douxu Date: Tue, 25 Mar 2025 17:00:09 +0800 Subject: [PATCH] refactor(redis hash): fix bug of redis hash 1.optimize RedisOption struct fix(uuid): replace uuid mod dependencies 1.replace uuid mod dependencies fix(config): add new redis config 1.add new redis config --- config/config.go | 17 ++-- config/config.yaml | 9 +- diagram/redis_hash.go | 3 +- diagram/redis_init.go | 2 +- diagram/redis_set.go | 3 +- .../{locker_client_init.go => locker_init.go} | 5 +- distributedlock/redis_lock.go | 11 ++- distributedlock/redis_rwlock.go | 48 +++++----- distributedlock/rwlock_test.go | 2 +- go.mod | 4 - go.sum | 45 --------- main.go | 6 +- util/redis_init.go | 36 ++++++++ util/redis_options.go | 92 +++++-------------- 14 files changed, 118 insertions(+), 165 deletions(-) rename distributedlock/{locker_client_init.go => locker_init.go} (93%) create mode 100644 util/redis_init.go diff --git a/config/config.go b/config/config.go index 297dc51..9a3bfb8 100644 --- a/config/config.go +++ b/config/config.go @@ -69,14 +69,15 @@ type DataRTConfig struct { // ModelRTConfig define config stuct of model runtime server type ModelRTConfig struct { - BaseConfig `mapstructure:"base"` - PostgresConfig `mapstructure:"postgres"` - KafkaConfig `mapstructure:"kafka"` - LoggerConfig `mapstructure:"logger"` - AntsConfig `mapstructure:"ants"` - DataRTConfig `mapstructure:"dataRT"` - RedisConfig `mapstructure:"redis"` - PostgresDBURI string `mapstructure:"-"` + BaseConfig `mapstructure:"base"` + PostgresConfig `mapstructure:"postgres"` + KafkaConfig `mapstructure:"kafka"` + LoggerConfig `mapstructure:"logger"` + AntsConfig `mapstructure:"ants"` + DataRTConfig `mapstructure:"dataRT"` + LockerRedisConfig RedisConfig `mapstructure:"locker_redis"` + StorageRedisConfig RedisConfig `mapstructure:"storage_redis"` + PostgresDBURI string `mapstructure:"-"` } // ReadAndInitConfig return modelRT project config struct diff --git a/config/config.yaml b/config/config.yaml index 55bc8be..57ac79c 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -37,13 +37,20 @@ ants: rtd_receive_concurrent_quantity: 10 # redis config -redis: +locker_redis: addr: "192.168.2.104:6379" password: "" db: 1 poolsize: 50 timeout: 10 +storage_redis: + addr: "192.168.2.104:6379" + password: "" + db: 0 + poolsize: 50 + timeout: 10 + # modelRT base config base: grid_id: 1 diff --git a/diagram/redis_hash.go b/diagram/redis_hash.go index 13b883d..4446a69 100644 --- a/diagram/redis_hash.go +++ b/diagram/redis_hash.go @@ -3,7 +3,6 @@ package diagram import ( "context" - distributed_lock "modelRT/distributedlock" locker "modelRT/distributedlock" "modelRT/logger" @@ -24,7 +23,7 @@ type RedisHash struct { func NewRedisHash(ctx context.Context, hashKey string, token string, lockLeaseTime uint64, needRefresh bool) *RedisHash { return &RedisHash{ ctx: ctx, - rwLocker: distributed_lock.InitRWLocker(hashKey, token, lockLeaseTime, needRefresh), + rwLocker: locker.InitRWLocker(hashKey, token, lockLeaseTime, needRefresh), storageClient: GetRedisClientInstance(), logger: logger.GetLoggerInstance(), } diff --git a/diagram/redis_init.go b/diagram/redis_init.go index 1ee3207..3aa0fa5 100644 --- a/diagram/redis_init.go +++ b/diagram/redis_init.go @@ -18,7 +18,7 @@ var ( // initClient define func of return successfully initialized redis client func initClient(rCfg config.RedisConfig) *redis.Client { client, err := util.NewRedisClient( - util.WithAddr(rCfg.Addr), + rCfg.Addr, util.WithPassword(rCfg.Password), util.WithDB(rCfg.DB), util.WithPoolSize(rCfg.PoolSize), diff --git a/diagram/redis_set.go b/diagram/redis_set.go index d70a8b5..dcfdeaa 100644 --- a/diagram/redis_set.go +++ b/diagram/redis_set.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - distributed_lock "modelRT/distributedlock" locker "modelRT/distributedlock" "modelRT/logger" @@ -24,7 +23,7 @@ type RedisSet struct { func NewRedisSet(ctx context.Context, hashKey string, token string, lockLeaseTime uint64, needRefresh bool) *RedisSet { return &RedisSet{ ctx: ctx, - rwLocker: distributed_lock.InitRWLocker(hashKey, token, lockLeaseTime, needRefresh), + rwLocker: locker.InitRWLocker(hashKey, token, lockLeaseTime, needRefresh), storageClient: GetRedisClientInstance(), logger: logger.GetLoggerInstance(), } diff --git a/distributedlock/locker_client_init.go b/distributedlock/locker_init.go similarity index 93% rename from distributedlock/locker_client_init.go rename to distributedlock/locker_init.go index 2f1d82c..35ecc78 100644 --- a/distributedlock/locker_client_init.go +++ b/distributedlock/locker_init.go @@ -1,4 +1,4 @@ -package distributed_lock +package distributedlock import ( "sync" @@ -18,8 +18,9 @@ var ( // initClient define func of return successfully initialized redis client func initClient(rCfg config.RedisConfig) *redis.Client { client, err := util.NewRedisClient( - util.WithAddr(rCfg.Addr), + rCfg.Addr, util.WithPassword(rCfg.Password), + util.WithDB(rCfg.DB), util.WithPoolSize(rCfg.PoolSize), util.WithTimeout(time.Duration(rCfg.Timeout)*time.Second), ) diff --git a/distributedlock/redis_lock.go b/distributedlock/redis_lock.go index 08e34f4..0f6a5b9 100644 --- a/distributedlock/redis_lock.go +++ b/distributedlock/redis_lock.go @@ -1,4 +1,4 @@ -package distributed_lock +package distributedlock import ( "context" @@ -12,7 +12,7 @@ import ( luascript "modelRT/distributedlock/luascript" "modelRT/logger" - uuid "github.com/google/uuid" + uuid "github.com/gofrs/uuid" "github.com/redis/go-redis/v9" "go.uber.org/zap" ) @@ -220,9 +220,14 @@ func (rl *redissionLocker) UnLock(ctx context.Context) error { return nil } +// TODO 优化 panic func GetLocker(client *redis.Client, ops *RedissionLockConfig) *redissionLocker { if ops.Token == "" { - ops.Token = uuid.New().String() + token, err := uuid.NewV4() + if err != nil { + panic(err) + } + ops.Token = token.String() } if len(ops.Prefix) <= 0 { diff --git a/distributedlock/redis_rwlock.go b/distributedlock/redis_rwlock.go index afd1edb..d873b01 100644 --- a/distributedlock/redis_rwlock.go +++ b/distributedlock/redis_rwlock.go @@ -1,4 +1,4 @@ -package distributed_lock +package distributedlock import ( "context" @@ -12,7 +12,7 @@ import ( "modelRT/distributedlock/luascript" "modelRT/logger" - uuid "github.com/google/uuid" + uuid "github.com/gofrs/uuid" "github.com/redis/go-redis/v9" "go.uber.org/zap" ) @@ -240,33 +240,38 @@ func (rl *RedissionRWLocker) UnWLock(ctx context.Context) error { return nil } -func GetRWLocker(client *redis.Client, ops *RedissionLockConfig) *RedissionRWLocker { - if ops.Token == "" { - ops.Token = uuid.New().String() +// TODO 优化 panic +func GetRWLocker(client *redis.Client, conf *RedissionLockConfig) *RedissionRWLocker { + if conf.Token == "" { + token, err := uuid.NewV4() + if err != nil { + panic(err) + } + conf.Token = token.String() } - if ops.Prefix == "" { - ops.Prefix = "redission-rwlock" + if conf.Prefix == "" { + conf.Prefix = "redission-rwlock" } - if ops.TimeoutPrefix == "" { - ops.TimeoutPrefix = "rwlock_timeout" + if conf.TimeoutPrefix == "" { + conf.TimeoutPrefix = "rwlock_timeout" } - if ops.ChanPrefix == "" { - ops.ChanPrefix = "redission-rwlock-channel" + if conf.ChanPrefix == "" { + conf.ChanPrefix = "redission-rwlock-channel" } - if ops.LockLeaseTime == 0 { - ops.LockLeaseTime = internalLockLeaseTime + if conf.LockLeaseTime == 0 { + conf.LockLeaseTime = internalLockLeaseTime } r := &redissionLocker{ - token: ops.Token, - key: strings.Join([]string{ops.Prefix, ops.Key}, ":"), - needRefresh: ops.NeedRefresh, - lockLeaseTime: ops.LockLeaseTime, - waitChanKey: strings.Join([]string{ops.ChanPrefix, ops.Key, "write"}, ":"), + token: conf.Token, + key: strings.Join([]string{conf.Prefix, conf.Key}, ":"), + needRefresh: conf.NeedRefresh, + lockLeaseTime: conf.LockLeaseTime, + waitChanKey: strings.Join([]string{conf.ChanPrefix, conf.Key, "write"}, ":"), client: client, exit: make(chan struct{}), once: &sync.Once{}, @@ -275,18 +280,17 @@ func GetRWLocker(client *redis.Client, ops *RedissionLockConfig) *RedissionRWLoc rwLocker := &RedissionRWLocker{ redissionLocker: *r, - rwTokenTimeoutPrefix: ops.TimeoutPrefix, + rwTokenTimeoutPrefix: conf.TimeoutPrefix, } return rwLocker } -// TODO consider refactoring to use options mode func InitRWLocker(key string, token string, lockLeaseTime uint64, needRefresh bool) *RedissionRWLocker { - ops := &RedissionLockConfig{ + conf := &RedissionLockConfig{ Key: key, Token: token, LockLeaseTime: lockLeaseTime, NeedRefresh: needRefresh, } - return GetRWLocker(GetRedisClientInstance(), ops) + return GetRWLocker(GetRedisClientInstance(), conf) } diff --git a/distributedlock/rwlock_test.go b/distributedlock/rwlock_test.go index 0ecb718..2ad045e 100644 --- a/distributedlock/rwlock_test.go +++ b/distributedlock/rwlock_test.go @@ -1,4 +1,4 @@ -package distributed_lock +package distributedlock import ( "context" diff --git a/go.mod b/go.mod index 5e07739..f1591bf 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,7 @@ require ( github.com/bitly/go-simplejson v0.5.1 github.com/confluentinc/confluent-kafka-go v1.9.2 github.com/gin-gonic/gin v1.10.0 - github.com/go-redis/redis v6.15.9+incompatible github.com/gofrs/uuid v4.4.0+incompatible - github.com/google/uuid v1.4.0 github.com/gorilla/websocket v1.5.3 github.com/json-iterator/go v1.1.12 github.com/natefinch/lumberjack v2.0.0+incompatible @@ -62,8 +60,6 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect - github.com/onsi/gomega v1.18.1 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect diff --git a/go.sum b/go.sum index 376699e..2f08fc6 100644 --- a/go.sum +++ b/go.sum @@ -60,8 +60,6 @@ github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= @@ -89,9 +87,6 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -125,12 +120,9 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -138,9 +130,7 @@ github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4F github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -204,20 +194,6 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY 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/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= 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/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -276,7 +252,6 @@ github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -300,13 +275,11 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -314,13 +287,11 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= @@ -332,31 +303,22 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -370,7 +332,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= @@ -382,7 +343,6 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= @@ -428,7 +388,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -436,14 +395,10 @@ gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3M gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index db470ba..a0086cb 100644 --- a/main.go +++ b/main.go @@ -10,7 +10,7 @@ import ( "modelRT/config" "modelRT/database" "modelRT/diagram" - distributed_lock "modelRT/distributedlock" + locker "modelRT/distributedlock" _ "modelRT/docs" "modelRT/handler" "modelRT/logger" @@ -79,10 +79,10 @@ func main() { } defer parsePool.Release() - storageClient := diagram.InitClientInstance(modelRTConfig.RedisConfig) + storageClient := diagram.InitClientInstance(modelRTConfig.StorageRedisConfig) defer storageClient.Close() - lockerClient := distributed_lock.InitClientInstance(modelRTConfig.RedisConfig) + lockerClient := locker.InitClientInstance(modelRTConfig.LockerRedisConfig) defer lockerClient.Close() // init anchor param ants pool diff --git a/util/redis_init.go b/util/redis_init.go new file mode 100644 index 0000000..441f4c4 --- /dev/null +++ b/util/redis_init.go @@ -0,0 +1,36 @@ +package util + +import ( + "context" + "fmt" + + "github.com/redis/go-redis/v9" +) + +// NewRedisClient define func of initialize the Redis client +func NewRedisClient(addr string, opts ...RedisOption) (*redis.Client, error) { + // default options + options := RedisOptions{ + redisOptions: &redis.Options{ + Addr: addr, + }, + } + + // Apply configuration options from config + for _, opt := range opts { + opt(&options) + } + + // create redis client + client := redis.NewClient(options.redisOptions) + + if options.timeout > 0 { + // check if the connection is successful + ctx, cancel := context.WithTimeout(context.Background(), options.timeout) + defer cancel() + if err := client.Ping(ctx).Err(); err != nil { + return nil, fmt.Errorf("can not connect redis:%v", err) + } + } + return client, nil +} diff --git a/util/redis_options.go b/util/redis_options.go index 79e9115..23ed270 100644 --- a/util/redis_options.go +++ b/util/redis_options.go @@ -1,41 +1,37 @@ package util import ( - "context" "errors" - "fmt" "time" "github.com/redis/go-redis/v9" ) -// RedisOptions define struct of redis client config options type RedisOptions struct { - Addr string - Password string - DB int - PoolSize int - Timeout time.Duration + redisOptions *redis.Options + timeout time.Duration } -// RedisOption define a function type for modify RedisOptions type RedisOption func(*RedisOptions) error -// WithAddr define func of configure redis addr options -func WithAddr(addr string) RedisOption { - return func(o *RedisOptions) error { - if addr == "" { - return errors.New("地址不能为空") - } - o.Addr = addr - return nil - } -} - // WithPassword define func of configure redis password options func WithPassword(password string) RedisOption { return func(o *RedisOptions) error { - o.Password = password + if password == "" { + return errors.New("password is empty") + } + o.redisOptions.Password = password + return nil + } +} + +// WithTimeout define func of configure redis timeout options +func WithTimeout(timeout time.Duration) RedisOption { + return func(o *RedisOptions) error { + if timeout < 0 { + return errors.New("timeout can not be negative") + } + o.timeout = timeout return nil } } @@ -44,9 +40,9 @@ func WithPassword(password string) RedisOption { func WithDB(db int) RedisOption { return func(o *RedisOptions) error { if db < 0 { - return errors.New("数据库编号不能为负数") + return errors.New("db can not be negative") } - o.DB = db + o.redisOptions.DB = db return nil } } @@ -55,55 +51,9 @@ func WithDB(db int) RedisOption { func WithPoolSize(poolSize int) RedisOption { return func(o *RedisOptions) error { if poolSize <= 0 { - return errors.New("连接池大小必须大于 0") + return errors.New("pool size must be greater than 0") } - o.PoolSize = poolSize + o.redisOptions.PoolSize = poolSize return nil } } - -// WithTimeout define func of configure timeout options -func WithTimeout(timeout time.Duration) RedisOption { - return func(o *RedisOptions) error { - if timeout <= 0 { - return errors.New("超时时间必须大于 0") - } - o.Timeout = timeout - return nil - } -} - -// NewRedisClient define func of initialize the Redis client -func NewRedisClient(opts ...RedisOption) (*redis.Client, error) { - // default options - options := &RedisOptions{ - Addr: "localhost:6379", - Password: "", - DB: 0, - PoolSize: 10, - Timeout: 5 * time.Second, - } - - // Apply configuration options from config - for _, opt := range opts { - if err := opt(options); err != nil { - return nil, err - } - } - - // create redis client - client := redis.NewClient(&redis.Options{ - Addr: options.Addr, - Password: options.Password, - DB: options.DB, - PoolSize: options.PoolSize, - }) - - // check if the connection is successful - ctx, cancel := context.WithTimeout(context.Background(), options.Timeout) - defer cancel() - if err := client.Ping(ctx).Err(); err != nil { - return nil, fmt.Errorf("can not connect redis:%v", err) - } - return client, nil -}