finclip-app-manager/vendor/gitlab.finogeeks.club/finclip-backend-v2/finclip-redis/init.go

130 lines
3.3 KiB
Go
Raw Permalink Normal View History

2023-11-02 18:36:36 +08:00
package fcredis
import (
"context"
"errors"
"fmt"
goRedis "github.com/go-redis/redis/v8"
"strings"
)
const (
ModeSingle = "single"
ModeSentinel = "sentinel"
ModeCluster = "cluster"
)
const (
SentinelClusterMode = "sentinelCluster"
SentinelNormalMode = "sentinelNormal"
)
var (
gUniClient goRedis.UniversalClient
gMode string
gSentinelMode string
)
var (
addrLackErr = errors.New("client init addr empty")
)
// Init 用来初始化redismode--redis模式可选项为: single--单例sentinel--主从cluster--集群
// opt是对应初始化的配置需要根据mode采用相应的类型: single:go-redis.Options,sentinel:go-redis.FailoverOptions,cluster:go-redis.ClusterOptions
// ext参数用来为主从模式指定是否采用"主节点写从节点读"的读写策略默认采用。不采用该策略时ext参数填为: fcredis.SentinelNormalMode
func Init(mode string, opt interface{}, ext ...interface{}) error {
gMode = mode
var err error
defer func(err error) {
fmt.Printf("[fcredis] mode:[%s],opt:%+v,ext:%+v,err:%+v\n", mode, opt, ext, err)
}(err)
switch strings.ToLower(mode) {
case ModeSingle:
option, ok := opt.(*goRedis.Options)
if !ok {
return errors.New("redis single mode need opt: go-redis.Options")
}
err = initSingleClient(option)
case ModeSentinel:
gSentinelMode = SentinelClusterMode
option, ok := opt.(*goRedis.FailoverOptions)
if !ok {
return errors.New("redis sentinel mode need opt: goRedis.FailoverOptions")
}
if len(ext) != 0 {
if sentinelMode, ok := ext[0].(string); ok {
if sentinelMode == SentinelNormalMode {
gSentinelMode = SentinelNormalMode
err = initSentinelFailoverClient(option)
break
}
}
}
fmt.Printf("[fcredis] sentinel mode:%s\n", gSentinelMode)
err = initSentinelFailoverClusterClient(option)
case ModeCluster:
option, ok := opt.(*goRedis.ClusterOptions)
if !ok {
return errors.New("redis cluster mode need opt: go-redis.ClusterOptions")
}
err = initClusterClient(option)
default:
return errors.New("mode must be: single、sentinel or cluster ")
}
return err
}
func initSingleClient(opt *goRedis.Options) (err error) {
fmt.Println("[fcredis] initSingleClient.")
if opt.Addr == "" {
return addrLackErr
}
gUniClient = goRedis.NewClient(opt)
return nil
}
func initSentinelFailoverClient(opt *goRedis.FailoverOptions) (err error) {
fmt.Println("[fcredis] initSentinelFailoverClient.")
if len(opt.SentinelAddrs) == 0 {
return addrLackErr
}
gUniClient = goRedis.NewFailoverClient(opt)
_, err = gUniClient.Ping(context.Background()).Result()
if err != nil {
return err
}
return nil
}
func initSentinelFailoverClusterClient(opt *goRedis.FailoverOptions) (err error) {
fmt.Println("[fcredis] initSentinelFailoverClusterClient.")
if len(opt.SentinelAddrs) == 0 {
return addrLackErr
}
gUniClient = goRedis.NewFailoverClusterClient(opt)
_, err = gUniClient.Ping(context.Background()).Result()
if err != nil {
return err
}
return nil
}
func initClusterClient(opt *goRedis.ClusterOptions) (err error) {
fmt.Println("[fcredis] initClusterClient.")
if len(opt.Addrs) == 0 {
return addrLackErr
}
gUniClient = goRedis.NewClusterClient(opt)
_, err = gUniClient.Ping(context.Background()).Result()
if err != nil {
return err
}
return nil
}