130 lines
3.3 KiB
Go
130 lines
3.3 KiB
Go
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 用来初始化redis,mode--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
|
||
}
|