mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-08 14:42:26 +08:00
1.增加redis支持 2.memcached支持多类型缓存
This commit is contained in:
104
cache/redis.go
vendored
Normal file
104
cache/redis.go
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/garyburd/redigo/redis"
|
||||
)
|
||||
|
||||
//Redis redis cache
|
||||
type Redis struct {
|
||||
conn *redis.Pool
|
||||
}
|
||||
|
||||
//RedisOpts redis 连接属性
|
||||
type RedisOpts struct {
|
||||
Host string
|
||||
Password string
|
||||
Database int
|
||||
MaxIdle int
|
||||
MaxActive int
|
||||
IdleTimeout time.Duration //second
|
||||
}
|
||||
|
||||
//NewRedis 实例化
|
||||
func NewRedis(opts *RedisOpts) *Redis {
|
||||
pool := &redis.Pool{
|
||||
MaxActive: opts.MaxActive,
|
||||
MaxIdle: opts.MaxIdle,
|
||||
IdleTimeout: opts.IdleTimeout,
|
||||
Dial: func() (redis.Conn, error) {
|
||||
return redis.Dial("tcp", opts.Host,
|
||||
redis.DialDatabase(opts.Database),
|
||||
redis.DialPassword(opts.Password),
|
||||
)
|
||||
},
|
||||
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}
|
||||
}
|
||||
|
||||
//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)
|
||||
if i > 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
//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
|
||||
}
|
||||
Reference in New Issue
Block a user