Passed
Pull Request — main (#166)
by Yume
02:23
created

infrastructures.*RedisManager.NewRedisClient   A

Complexity

Conditions 2

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 9
dl 0
loc 13
rs 9.95
c 0
b 0
f 0
nop 1
1
package infrastructures
2
3
import (
4
	"context"
5
	"log/slog"
6
	"sync"
7
	"time"
8
9
	"github.com/gofiber/fiber/v2/log"
10
	"github.com/redis/go-redis/extra/redisotel/v9"
11
	"github.com/redis/go-redis/v9"
12
)
13
14
type RedisManager struct {
15
	client      *redis.Client
16
	Redisconfig RedisConfig
17
}
18
19
type RedisConfig struct {
20
	Addr         string
21
	Password     string
22
	MinIdleConns int
23
	PoolSize     int
24
	PoolTimeout  int
25
}
26
27
var (
28
	redisInstance *RedisManager //nolint:gochecknoglobals //Singleton
29
	redisOnce     sync.Once     //nolint:gochecknoglobals //Singleton
30
)
31
32
func GetRedisClient() *redis.Client {
33
	return GetRedisManagerInstance().GetRedisClient()
34
}
35
36
func GetRedisManagerInstance() *RedisManager {
37
	redisOnce.Do(func() {
38
		redisInstance = &RedisManager{}
39
	})
40
	return redisInstance
41
}
42
43
func NewRedisInstance(redisConf RedisConfig) *RedisManager {
44
	return GetRedisManagerInstance().RedisWithConfig(redisConf)
45
}
46
47
func (r *RedisManager) RedisWithConfig(redisConf RedisConfig) *RedisManager {
48
	r.Redisconfig = redisConf
49
	return r
50
}
51
52
func (r *RedisManager) ConnectRedis() error {
53
	r.client = redis.NewClient(&redis.Options{
54
		Addr:         r.Redisconfig.Addr,
55
		Password:     r.Redisconfig.Password,
56
		MinIdleConns: r.Redisconfig.MinIdleConns,
57
		PoolSize:     r.Redisconfig.PoolSize,
58
		PoolTimeout:  time.Duration(r.Redisconfig.PoolTimeout) * time.Second,
59
	})
60
61
	if err := redisotel.InstrumentTracing(r.client); err != nil {
62
		log.Error("failed to instrument redis", slog.Any("error", err))
63
	}
64
65
	_, err := r.client.Ping(context.Background()).Result()
66
	if err != nil {
67
		return err
68
	}
69
70
	return nil
71
}
72
73
func (r *RedisManager) CloseRedis() error {
74
	return r.client.Close()
75
}
76
77
func (r *RedisManager) GetRedisClient() *redis.Client {
78
	return r.client
79
}
80