/**
封装redis常用方法,使用github.com/garyburd/redigo/redis库。
示例:
New("localhost", 6379, "This is password", 0)
r := GetInstance()
r.set("keyname", "keyvalue", 30)
*/
package redisgo
import (
"encoding/json"
"fmt"
"github.com/garyburd/redigo/redis"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
type Redis struct {
pool *redis.Pool
}
var redisInstance *Redis
var once sync.Once
func New(addr, password string, db int) *Redis {
once.Do(func() {
pool := &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", addr) //ip + ":" + strconv.Itoa(port))
if err != nil {
return nil, err
}
if password != "" {
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
}
if _, err := c.Do("SELECT", db); err != nil {
c.Close()
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
}
redisInstance = &Redis{
pool: pool,
}
redisInstance.closePool()
})
return redisInstance
}
func GetInstance() *Redis {
if redisInstance == nil {
panic("请先调用New方法创建实例")
}
return redisInstance
}
func (r *Redis) closePool() {
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
signal.Notify(c, syscall.SIGTERM)
signal.Notify(c, syscall.SIGKILL)
go func() {
<-c
r.pool.Close()
os.Exit(0)
}()
}
func (r *Redis) Do(commandName string, args ...interface{
}) (reply interface{
}, err error) {
conn := r.pool.Get()
defer conn.Close()
return conn.Do(commandName, args...)
}
func (r *Redis) Send(commandName string, args ...interface{
}) error {
conn := r.pool.Get()
defer conn.Close()
return conn.Send(commandName, args...)
<
redis:github.com/garyburd/redigo/redis封装
最新推荐文章于 2023-03-20 22:47:25 发布