1.创建连接池方法文件
- package dao
-
- import (
- "fmt"
- "github.com/gomodule/redigo/redis"
- "gopkg.in/ini.v1"
- "os"
- "sync"
- "time"
- )
-
- var once sync.Once
-
- // RedisClient Redis 服务
- type RedisClient struct {
- Client *redis.Pool
- }
-
- //Redis 全局 Redis
- var RedisPool *RedisClient
-
- //ConnectRedis 连接 redis 数据库,设置全局的 Redis 对象
- func ConnectRedis() {
- config, err := ini.Load("./config/app.ini")
- if err != nil {
- //失败
- fmt.Printf("Fail to read file: %v", err)
- os.Exit(1)
- }
- address := config.Section("redis").Key("address").String()
- password := config.Section("redis").Key("password").String()
- db, _ := config.Section("redis").Key("db").Int()
- once.Do(func() {
- RedisPool = NewClient(address, password, db)
- })
- con_err := RedisPool.Ping()
- if con_err != nil {
- panic(con_err)
- }
- }
-
- // NewClient 创建一个新的 redis 连接
- func NewClient(address string, password string, db int) *RedisClient {
- // 初始化自定的 RedisClient 实例
- rds := &RedisClient{}
- // 使用 redis 库里的 NewClient 初始化连接
- rds.Client = &redis.Pool{
- MaxIdle: 100, //最大空闲
- MaxActive: 1000, //最大连接
- IdleTimeout: time.Duration(60) * time.Second,
- Wait: true,
- Dial: func() (redis.Conn, error) {
- c, err := redis.Dial(
- "tcp",
- address,
- redis.DialPassword(password),
- redis.DialDatabase(int(db)),
- redis.DialConnectTimeout(time.Duration(60)*time.Second),
- redis.DialReadTimeout(time.Duration(60)*time.Second),
- redis.DialWriteTimeout(time.Duration(60)*time.Second),
- )
- if err != nil {
- return nil, err
- }
- return c, err
- },
- }
- return rds
- }
-
- // Ping 用以测试 redis 连接是否正常
- func (rds *RedisClient) Ping() error {
- _, err := rds.Client.Get().Do("ping")
- return err
- }
-
- // Set 存储 key 对应的 value,且设置 expiration 过期时间(单位纳秒)
- func (rds *RedisClient) Setex(key string, expiration int, value interface{}) bool {
- conn := rds.Client.Get()
- defer conn.Close()
- if _, err := conn.Do("setex", key, expiration, value); err != nil {
- fmt.Println(err)
- return false
- }
- return true
- }
-
- //
- //Get 获取 key 对应的 value
- func (rds *RedisClient) Get(key string) string {
- conn := rds.Client.Get()
- defer conn.Close()
- result, err := redis.String(conn.Do("Get", key))
- if err != nil {
- return ""
- }
- return result
- }
-
- //Get 获取 key 对应的 value
- func (rds *RedisClient) Rpop(key string) (string, error) {
- conn := rds.Client.Get()
- defer conn.Close()
- result, err := redis.String(conn.Do("Rpop", key))
- if err != nil {
- return "", err
- }
- return result, nil
- }
2.配置文件
- app_name = go-gin
-
-
- [mysql]
- ip = 127.0.0.1
- port = 3306
- user = root
- password = root
- database = test
- prefix = tt_
- #最大连接数
- MaxIdleConns = 500
- #最大空闲
- MaxOpenConns = 50
-
- [redis]
- address = 127.0.0.1:6379
- password = 123456
- db = 7
3.调用方法
- func main() {
- dao.ConnectRedis() //初始化连接redis
- defer dao.RedisPool.Client.Close() //退出前执行关闭
- res, err := dao.RedisPool.Rpop("aaa")
- if err != nil {
- fmt.Println(err)
- }
- fmt.Println(res)
- }