/
redis_conn.go
106 lines (89 loc) · 1.72 KB
/
redis_conn.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
96
97
98
99
100
101
102
103
104
105
106
/*
使用方法:
1. init
func init(){
InitRds(&RDSConfig{
Host:"127.0.0.1",
Port:2379,
Password:"123456",
MaxIdle:10,
MaxActive:10000,
DB:0,
})
}
2.调用操作方法
rc:=new(RdsCommon)
val,err:=rc.Get(key)
....
...
*/
package redis
import (
"errors"
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)
//RDSConfig redis 配置结构
type RDSConfig struct {
Host string
Port int
Password string
MaxIdle int
MaxActive int
DB int
}
var cmd = new(RDSCommon)
//InitRDSClient init config
func InitRDSClient(rdc *RDSConfig) (err error) {
if rdc == nil {
err = fmt.Errorf("[RDS] 没有需要init的redis")
return
}
if rdc.Host == "" || rdc.Port == 0 {
err = fmt.Errorf("[RDS] 没有配置主机或端口")
return
}
cmd.Pool(newRedisPools(rdc))
return
}
// ====================private====================
// newRedisPools
func newRedisPools(rdc *RDSConfig) *redis.Pool {
p := &redis.Pool{
MaxIdle: rdc.MaxIdle,
MaxActive: rdc.MaxActive,
IdleTimeout: 30 * time.Second,
Wait: true,
Dial: func() (conn redis.Conn, err error) {
return setDialog(rdc)
},
}
rc := p.Get()
defer rc.Close()
_, err := rc.Do("PING")
if err != nil {
panic(fmt.Sprintf("[RDS] redis 初始化失败 %v", err))
return nil
}
return p
}
// setDialog
func setDialog(rdc *RDSConfig) (redis.Conn, error) {
conn, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", rdc.Host, rdc.Port))
if err != nil {
return nil, err
}
if conn == nil {
return nil, errors.New("连接redis错误")
}
if len(rdc.Password) != 0 {
if _, err := conn.Do("AUTH", rdc.Password); err != nil {
conn.Close()
}
}
if _, err := conn.Do("SELECT", rdc.DB); err != nil {
conn.Close()
}
return conn, nil
}