113 lines
2.3 KiB
Go
113 lines
2.3 KiB
Go
|
package cache
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"time"
|
||
|
|
||
|
"github.com/gomodule/redigo/redis"
|
||
|
)
|
||
|
|
||
|
// Redis .redis cache
|
||
|
type Redis struct {
|
||
|
conn *redis.Pool
|
||
|
}
|
||
|
|
||
|
// RedisOpts redis 连接属性
|
||
|
type RedisOpts struct {
|
||
|
Host string `yml:"host" json:"host"`
|
||
|
Password string `yml:"password" json:"password"`
|
||
|
Database int `yml:"database" json:"database"`
|
||
|
MaxIdle int `yml:"max_idle" json:"max_idle"`
|
||
|
MaxActive int `yml:"max_active" json:"max_active"`
|
||
|
IdleTimeout int `yml:"idle_timeout" json:"idle_timeout"` // second
|
||
|
}
|
||
|
|
||
|
// NewRedis 实例化
|
||
|
func NewRedis(opts *RedisOpts, dialOpts ...redis.DialOption) *Redis {
|
||
|
pool := &redis.Pool{
|
||
|
MaxActive: opts.MaxActive,
|
||
|
MaxIdle: opts.MaxIdle,
|
||
|
IdleTimeout: time.Second * time.Duration(opts.IdleTimeout),
|
||
|
Dial: func() (redis.Conn, error) {
|
||
|
dialOpts = append(dialOpts, []redis.DialOption{
|
||
|
redis.DialDatabase(opts.Database),
|
||
|
redis.DialPassword(opts.Password),
|
||
|
}...)
|
||
|
return redis.Dial("tcp", opts.Host, dialOpts...)
|
||
|
},
|
||
|
TestOnBorrow: func(conn redis.Conn, t time.Time) error {
|
||
|
if time.Since(t) < time.Minute {
|
||
|
return nil
|
||
|
}
|
||
|
_, err := conn.Do("PING")
|
||
|
return err
|
||
|
},
|
||
|
}
|
||
|
return &Redis{pool}
|
||
|
}
|
||
|
|
||
|
// SetRedisPool 设置redis连接池
|
||
|
func (r *Redis) SetRedisPool(pool *redis.Pool) {
|
||
|
r.conn = pool
|
||
|
}
|
||
|
|
||
|
// SetConn 设置conn
|
||
|
func (r *Redis) SetConn(conn *redis.Pool) {
|
||
|
r.conn = conn
|
||
|
}
|
||
|
|
||
|
// Get 获取一个值
|
||
|
func (r *Redis) Get(key string) interface{} {
|
||
|
conn := r.conn.Get()
|
||
|
defer conn.Close()
|
||
|
|
||
|
var data []byte
|
||
|
var err error
|
||
|
if data, err = redis.Bytes(conn.Do("GET", key)); err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
var reply interface{}
|
||
|
if err = json.Unmarshal(data, &reply); err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return reply
|
||
|
}
|
||
|
|
||
|
// Set 设置一个值
|
||
|
func (r *Redis) Set(key string, val interface{}, timeout time.Duration) (err error) {
|
||
|
conn := r.conn.Get()
|
||
|
defer conn.Close()
|
||
|
|
||
|
var data []byte
|
||
|
if data, err = json.Marshal(val); err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
_, err = conn.Do("SETEX", key, int64(timeout/time.Second), data)
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// IsExist 判断key是否存在
|
||
|
func (r *Redis) IsExist(key string) bool {
|
||
|
conn := r.conn.Get()
|
||
|
defer conn.Close()
|
||
|
|
||
|
a, _ := conn.Do("EXISTS", key)
|
||
|
i := a.(int64)
|
||
|
return i > 0
|
||
|
}
|
||
|
|
||
|
// Delete 删除
|
||
|
func (r *Redis) Delete(key string) error {
|
||
|
conn := r.conn.Get()
|
||
|
defer conn.Close()
|
||
|
|
||
|
if _, err := conn.Do("DEL", key); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|