176 lines
5.4 KiB
Go
176 lines
5.4 KiB
Go
package redis
|
|
|
|
import (
|
|
"context"
|
|
"finclip-app-manager/infrastructure/config"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/SkyAPM/go2sky"
|
|
"github.com/garyburd/redigo/redis"
|
|
goRedis "github.com/go-redis/redis/v8"
|
|
fcredis "gitlab.finogeeks.club/finclip-backend-v2/finclip-redis"
|
|
"gitlab.finogeeks.club/finclip-backend/apm"
|
|
)
|
|
|
|
const (
|
|
MODE_SINGLE = "single"
|
|
MODE_SENTINEL = "sentinel"
|
|
MODE_SENTINEL_V2 = "sentinel_v2"
|
|
MODE_CLUSTER = "cluster"
|
|
MODE_CLUSTER_V2 = "cluster_v2"
|
|
)
|
|
|
|
func init() {
|
|
RedisStart()
|
|
}
|
|
|
|
func RedisStart() {
|
|
cfg := config.GetConfig()
|
|
switch cfg.RedisMode {
|
|
case "single":
|
|
opt, err := goRedis.ParseURL(cfg.RedisAddr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
opt.Password = cfg.RedisPassword
|
|
err = fcredis.Init("single", opt)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
case "sentinel", "sentinel_v2":
|
|
opt := &goRedis.FailoverOptions{
|
|
SentinelAddrs: strings.Split(cfg.RedisSentinelAddr, ","),
|
|
SentinelPassword: cfg.RedisSentinelPassword,
|
|
MasterName: cfg.RedisMasterName,
|
|
DB: cfg.RedisDatabase,
|
|
}
|
|
if err := fcredis.Init("sentinel", opt); err != nil {
|
|
panic(err)
|
|
}
|
|
case "cluster", "cluster_v2":
|
|
opt := &goRedis.ClusterOptions{
|
|
Addrs: strings.Split(cfg.RedisAddr, ","),
|
|
Password: cfg.RedisPassword,
|
|
}
|
|
if err := fcredis.Init("cluster", opt); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func createRedisSpan(ctx context.Context, action string) go2sky.Span {
|
|
switch config.GetConfig().RedisMode {
|
|
case MODE_SENTINEL_V2:
|
|
span := apm.ApmClient().CreateRedisExitSpan(ctx, action,
|
|
config.GetConfig().RedisSentinelAddr, "")
|
|
span.Log(time.Now(), "Mode", config.GetConfig().RedisMode)
|
|
span.Log(time.Now(), "MasterName", config.GetConfig().RedisMasterName)
|
|
return span
|
|
case MODE_CLUSTER:
|
|
span := apm.ApmClient().CreateRedisExitSpan(ctx, action,
|
|
config.GetConfig().RedisAddr, "")
|
|
span.Log(time.Now(), "Mode", config.GetConfig().RedisMode)
|
|
return span
|
|
case MODE_CLUSTER_V2:
|
|
span := apm.ApmClient().CreateRedisExitSpan(ctx, action,
|
|
config.GetConfig().RedisAddr, "")
|
|
span.Log(time.Now(), "Mode", config.GetConfig().RedisMode)
|
|
return span
|
|
default:
|
|
if config.GetConfig().RedisMode == MODE_SENTINEL {
|
|
span := apm.ApmClient().CreateRedisExitSpan(ctx, action,
|
|
config.GetConfig().RedisSentinelAddr, "")
|
|
span.Log(time.Now(), "Mode", config.GetConfig().RedisMode)
|
|
span.Log(time.Now(), "MasterName", config.GetConfig().RedisMasterName)
|
|
return span
|
|
} else {
|
|
span := apm.ApmClient().CreateRedisExitSpan(ctx, action,
|
|
config.GetConfig().RedisAddr, "")
|
|
span.Log(time.Now(), "Mode", config.GetConfig().RedisMode)
|
|
return span
|
|
}
|
|
}
|
|
}
|
|
|
|
func RedisSet(ctx context.Context, key string, value string, expireTime int) (err error) {
|
|
span := createRedisSpan(ctx, "RedisSet")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Set(ctx, "finclip_"+key, value, time.Duration(expireTime)*time.Second).Err()
|
|
}
|
|
|
|
func RedisGet(ctx context.Context, key string) (s string, err error) {
|
|
span := createRedisSpan(ctx, "RedisGet")
|
|
span.Log(time.Now(), "key", key)
|
|
return fcredis.Client().Get(ctx, "finclip_"+key).Result()
|
|
}
|
|
|
|
func RedisGetNum(ctx context.Context, key string) (s int, err error) {
|
|
span := createRedisSpan(ctx, "RedisGet")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Get(ctx, "finclip_"+key).Int()
|
|
}
|
|
|
|
func RedisDel(ctx context.Context, key string) (err error) {
|
|
span := createRedisSpan(ctx, "RedisDel")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Del(ctx, "finclip_"+key).Err()
|
|
}
|
|
|
|
func Setnx(ctx context.Context, key string, value string, expireTime int) (exi bool, err error) {
|
|
span := createRedisSpan(ctx, "Setnx")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
notExi, err := fcredis.Client().SetNX(ctx, "finclip_"+key, value, time.Duration(expireTime)*time.Second).Result()
|
|
return !notExi, err
|
|
}
|
|
|
|
func RedisSetByte(ctx context.Context, key string, value []byte, expireTime int) (err error) {
|
|
span := createRedisSpan(ctx, "RedisSetByte")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Set(ctx, "finclip_"+key, value, time.Duration(expireTime)*time.Second).Err()
|
|
}
|
|
|
|
func RedisGetByte(ctx context.Context, key string) (bytes []byte, err error) {
|
|
span := createRedisSpan(ctx, "RedisGetByte")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Get(ctx, "finclip_"+key).Bytes()
|
|
}
|
|
|
|
func RedisSetExpire(ctx context.Context, key string, sec int) (err error) {
|
|
span := createRedisSpan(ctx, "RedisSetExpire")
|
|
span.Log(time.Now(), "key", key)
|
|
defer span.End()
|
|
return fcredis.Client().Expire(ctx, "finclip_"+key, time.Duration(sec)*time.Second).Err()
|
|
}
|
|
|
|
func RedisIncrValue(ctx context.Context, key string) (value int, err error) {
|
|
span := createRedisSpan(ctx, "RedisIncrValue")
|
|
span.Log(time.Now(), "key", key)
|
|
result, err := fcredis.Client().Incr(ctx, "finclip_"+key).Result()
|
|
return int(result), err
|
|
|
|
}
|
|
|
|
func RedisGetIntValue(ctx context.Context, key string) (val int, err error) {
|
|
return fcredis.Client().Get(ctx, "finclip_"+key).Int()
|
|
}
|
|
|
|
func TryLock(ctx context.Context, key string, lockTime time.Duration) (ok bool, err error) {
|
|
return fcredis.Lock(ctx, "finclip_"+key, lockTime*time.Second)
|
|
}
|
|
|
|
func Unlock(ctx context.Context, key string) error {
|
|
return fcredis.Client().Del(ctx, "finclip_"+key).Err()
|
|
}
|
|
|
|
func RedisNotFound(err error) bool {
|
|
return err == goRedis.Nil || err == redis.ErrNil
|
|
}
|