162 lines
4.0 KiB
Go
162 lines
4.0 KiB
Go
// From https://gitlab.33.cn/proof/backend-micro/blob/dev/pkg/gredis/gredis.go
|
||
|
||
package redis
|
||
|
||
import (
|
||
"encoding/json"
|
||
"github.com/gomodule/redigo/redis"
|
||
xtime "gitlab.33.cn/chat/dtalk/pkg/time"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
// Config .
|
||
type Config struct {
|
||
Network string
|
||
Addr string
|
||
Auth string
|
||
Active int
|
||
Idle int
|
||
DialTimeout xtime.Duration
|
||
ReadTimeout xtime.Duration
|
||
WriteTimeout xtime.Duration
|
||
IdleTimeout xtime.Duration
|
||
Expire xtime.Duration
|
||
}
|
||
|
||
// Pool Redis缓存池结构
|
||
type Pool struct {
|
||
pool *redis.Pool
|
||
sync.RWMutex
|
||
}
|
||
|
||
func New(c *Config) *Pool {
|
||
pool := &redis.Pool{
|
||
MaxIdle: c.Idle,
|
||
MaxActive: c.Active,
|
||
IdleTimeout: time.Duration(c.IdleTimeout),
|
||
Dial: func() (redis.Conn, error) {
|
||
conn, err := redis.Dial(c.Network, c.Addr,
|
||
redis.DialConnectTimeout(time.Duration(c.DialTimeout)),
|
||
redis.DialReadTimeout(time.Duration(c.ReadTimeout)),
|
||
redis.DialWriteTimeout(time.Duration(c.WriteTimeout)),
|
||
redis.DialPassword(c.Auth),
|
||
)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return conn, nil
|
||
},
|
||
}
|
||
return &Pool{pool: pool}
|
||
}
|
||
|
||
// Do 向Redis服务发送命令并返回收到的答复
|
||
func (p *Pool) Do(cmd string, args ...interface{}) (interface{}, error) {
|
||
conn := p.pool.Get()
|
||
if err := conn.Err(); err != nil {
|
||
return nil, err
|
||
}
|
||
defer conn.Close()
|
||
return conn.Do(cmd, args...)
|
||
}
|
||
|
||
// Set 将数据data关联到给定key,time为key的超时时间(秒)
|
||
func (p *Pool) Set(key string, data interface{}, time ...int) error {
|
||
var err error
|
||
if len(time) != 0 {
|
||
_, err = p.Do("SET", key, data, "EX", time[0])
|
||
} else {
|
||
_, err = p.Do("SET", key, data)
|
||
}
|
||
return err
|
||
}
|
||
|
||
// Exists 检查给定key是否存在
|
||
func (p *Pool) Exists(key string) (bool, error) {
|
||
return redis.Bool(p.Do("EXISTS", key))
|
||
}
|
||
|
||
// GetBytes 返回给定key所关联的[]byte值
|
||
func (p *Pool) GetBytes(key string) ([]byte, error) {
|
||
return redis.Bytes(p.Do("GET", key))
|
||
}
|
||
|
||
// GetString 返回给定key所关联的string值
|
||
func (p *Pool) GetString(key string) (string, error) {
|
||
return redis.String(p.Do("GET", key))
|
||
}
|
||
|
||
// GetInt 返回给定key所关联的int值
|
||
func (p *Pool) GetInt(key string) (int, error) {
|
||
return redis.Int(p.Do("GET", key))
|
||
}
|
||
|
||
// GetInt64 返回给定key所关联的int64值
|
||
func (p *Pool) GetInt64(key string) (int64, error) {
|
||
return redis.Int64(p.Do("GET", key))
|
||
}
|
||
|
||
// Read 将给定key所关联的值反序列化到obj对象
|
||
func (p *Pool) Read(key string, obj interface{}) error {
|
||
if data, err := p.GetBytes(key); err == nil {
|
||
return json.Unmarshal(data, obj)
|
||
} else {
|
||
return err
|
||
}
|
||
}
|
||
|
||
// Write 将数据data序列化后关联到给定key,time为key的超时时间(秒)
|
||
func (p *Pool) Write(key string, obj interface{}, time ...int) error {
|
||
data, err := json.Marshal(obj)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if len(time) != 0 {
|
||
_, err = p.Do("SET", key, data, "EX", time[0])
|
||
} else {
|
||
_, err = p.Do("SET", key, data)
|
||
}
|
||
return err
|
||
}
|
||
|
||
// Del 删除给定key
|
||
func (p *Pool) Del(key string) (bool, error) {
|
||
return redis.Bool(p.Do("DEL", key))
|
||
}
|
||
|
||
// LikeDel 模糊删除给定key
|
||
//func (p *Pool) LikeDel(key string) error {
|
||
// keys, err := redis.Strings(p.Do("KEYS", "*"+key+"*"))
|
||
// if err != nil {
|
||
// return err
|
||
// }
|
||
// _, err = redis.Bool(p.Do("DEL", sliceUtil.StringsToInterfaces(keys)...))
|
||
// return err
|
||
//}
|
||
|
||
// TTL 返回给定key的剩余生存时间(秒)
|
||
func (p *Pool) TTL(key string) (int, error) {
|
||
return redis.Int(p.Do("TTL", key))
|
||
}
|
||
|
||
// Incr 将key所储存的数字值增一
|
||
func (p *Pool) Incr(key string) (int64, error) {
|
||
return redis.Int64(p.Do("INCR", key))
|
||
}
|
||
|
||
// IncrBy 将key所储存的数字值加上增量increment
|
||
func (p *Pool) IncrBy(key string, increment int64) (int64, error) {
|
||
return redis.Int64(p.Do("INCRBY", key, increment))
|
||
}
|
||
|
||
// Decr 将key所储存的数字值减一
|
||
func (p *Pool) Decr(key string) (int64, error) {
|
||
return redis.Int64(p.Do("DECR", key))
|
||
}
|
||
|
||
// DecrBy 将key所储存的数字值减去减量decrement
|
||
func (p *Pool) DecrBy(key string, decrement int64) (int64, error) {
|
||
return redis.Int64(p.Do("DECRBY", key, decrement))
|
||
}
|