Files
mayfly-go/server/internal/redis/rdm/conn.go
2024-03-02 19:08:19 +08:00

66 lines
1.6 KiB
Go

package rdm
import (
"context"
"mayfly-go/pkg/errorx"
"mayfly-go/pkg/logx"
"github.com/redis/go-redis/v9"
)
// redis连接信息
type RedisConn struct {
Id string
Info *RedisInfo
Cli *redis.Client
ClusterCli *redis.ClusterClient
}
// 获取命令执行接口的具体实现
func (r *RedisConn) GetCmdable() redis.Cmdable {
redisMode := r.Info.Mode
if redisMode == "" || redisMode == StandaloneMode || r.Info.Mode == SentinelMode {
return r.Cli
}
if redisMode == ClusterMode {
return r.ClusterCli
}
return nil
}
func (r *RedisConn) Scan(cursor uint64, match string, count int64) ([]string, uint64, error) {
return r.GetCmdable().Scan(context.Background(), cursor, match, count).Result()
}
// 执行redis命令
// 如: SET str value命令则args为['SET', 'str', 'val']
func (r *RedisConn) RunCmd(ctx context.Context, args ...any) (any, error) {
redisMode := r.Info.Mode
if redisMode == "" || redisMode == StandaloneMode || r.Info.Mode == SentinelMode {
return r.Cli.Do(ctx, args...).Result()
}
if redisMode == ClusterMode {
return r.ClusterCli.Do(ctx, args...).Result()
}
return nil, errorx.NewBiz("redis mode error")
}
func (r *RedisConn) Close() {
mode := r.Info.Mode
if mode == StandaloneMode || mode == SentinelMode {
if err := r.Cli.Close(); err != nil {
logx.Errorf("关闭redis单机实例[%s]连接失败: %s", r.Id, err.Error())
}
r.Cli = nil
return
}
if mode == ClusterMode {
if err := r.ClusterCli.Close(); err != nil {
logx.Errorf("关闭redis集群实例[%s]连接失败: %s", r.Id, err.Error())
}
r.ClusterCli = nil
}
}