/
redis.go
95 lines (81 loc) · 2.2 KB
/
redis.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package redis
import (
"log"
"time"
"github.com/gomodule/redigo/redis"
)
type Config struct {
Name string `json:"name"`
Addr string `json:"addr"`
Active int `json:"active"`
Idle int `json:"idle"`
DialTimeout int `json:"dial_timeout"` // millisecond
ReadTimeout int `json:"read_timeout"` // millisecond
WriteTimeout int `json:"write_timeout"` // millisecond
IdleTimeout int `json:"idle_timeout"` // second
DBNum int `json:"dbnum"`
Password string `json:"password"`
}
var redisPoolMap = make(map[string]*redis.Pool)
func Install(configs []*Config) {
for i := range configs {
config := configs[i]
pool := NewRedisPool(config)
redisPoolMap[config.Name] = pool
}
}
func MustGetPool(redisName string) *redis.Pool {
pool, ok := redisPoolMap[redisName]
if !ok {
panic("GetRedisClient - Not found pool")
}
return pool
}
func GetPool(redisName string) *redis.Pool {
return redisPoolMap[redisName]
}
func GetRedisPoolClient(redisName string) (conn redis.Conn) {
pool, ok := redisPoolMap[redisName]
if !ok {
panic("GetRedisClient - Not found client")
}
conn = pool.Get()
return
}
func NewRedisPool(c *Config) *redis.Pool {
cnop := redis.DialConnectTimeout(time.Duration(c.DialTimeout) * time.Millisecond)
rdop := redis.DialReadTimeout(time.Duration(c.ReadTimeout) * time.Millisecond)
wrop := redis.DialWriteTimeout(time.Duration(c.WriteTimeout) * time.Millisecond)
dialFunc := func() (redis.Conn, error) {
st := time.Now()
rconn, err := redis.Dial("tcp", c.Addr, cnop, rdop, wrop)
if err != nil {
log.Println("redis.Dial took:", time.Since(st), c.Addr)
return nil, err
}
took := time.Since(st)
if took.Milliseconds() > 1000 {
log.Println("redis dial slowly:", took)
}
if c.Password != "" {
if _, err = rconn.Do("AUTH", c.Password); err != nil {
log.Println("Err:", err)
_ = rconn.Close()
return nil, err
}
}
_, err = rconn.Do("SELECT", c.DBNum)
if err != nil {
_ = rconn.Close()
return nil, err
}
return rconn, nil
}
pool := &redis.Pool{
MaxActive: c.Active,
MaxIdle: c.Idle,
IdleTimeout: time.Duration(c.IdleTimeout) * time.Second,
Dial: dialFunc,
}
return pool
}