From 00ab67f623994dcd9d78abff28781f00633cb0ae Mon Sep 17 00:00:00 2001 From: wenzl Date: Thu, 26 Oct 2017 10:46:25 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0redis=E6=94=AF=E6=8C=81=202?= =?UTF-8?q?.memcached=E6=94=AF=E6=8C=81=E5=A4=9A=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/memcache.go | 28 +++++++----- cache/redis.go | 104 ++++++++++++++++++++++++++++++++++++++++++++ cache/redis_test.go | 32 ++++++++++++++ 3 files changed, 153 insertions(+), 11 deletions(-) create mode 100644 cache/redis.go create mode 100644 cache/redis_test.go diff --git a/cache/memcache.go b/cache/memcache.go index 010b2c6..3dee1bc 100644 --- a/cache/memcache.go +++ b/cache/memcache.go @@ -1,7 +1,7 @@ package cache import ( - "errors" + "encoding/json" "time" "github.com/bradfitz/gomemcache/memcache" @@ -20,28 +20,34 @@ func NewMemcache(server ...string) *Memcache { //Get return cached value func (mem *Memcache) Get(key string) interface{} { - if item, err := mem.conn.Get(key); err == nil { - return string(item.Value) + var err error + var item *memcache.Item + if item, err = mem.conn.Get(key); err != nil { + return nil } - return nil + var result interface{} + if err = json.Unmarshal(item.Value, &result); err != nil { + return nil + } + return result } // IsExist check value exists in memcache. func (mem *Memcache) IsExist(key string) bool { - _, err := mem.conn.Get(key) - if err != nil { + if _, err := mem.conn.Get(key); err != nil { return false } return true } //Set cached value with key and expire time. -func (mem *Memcache) Set(key string, val interface{}, timeout time.Duration) error { - v, ok := val.(string) - if !ok { - return errors.New("val must string") +func (mem *Memcache) Set(key string, val interface{}, timeout time.Duration) (err error) { + var data []byte + if data, err = json.Marshal(val); err != nil { + return err } - item := &memcache.Item{Key: key, Value: []byte(v), Expiration: int32(timeout / time.Second)} + + item := &memcache.Item{Key: key, Value: data, Expiration: int32(timeout / time.Second)} return mem.conn.Set(item) } diff --git a/cache/redis.go b/cache/redis.go new file mode 100644 index 0000000..31438c9 --- /dev/null +++ b/cache/redis.go @@ -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 +} diff --git a/cache/redis_test.go b/cache/redis_test.go new file mode 100644 index 0000000..3ced1d3 --- /dev/null +++ b/cache/redis_test.go @@ -0,0 +1,32 @@ +package cache + +import ( + "testing" + "time" +) + +func TestRedis(t *testing.T) { + opts := &RedisOpts{ + Host: "127.0.0.1:6379", + } + redis := NewRedis(opts) + var err error + timeoutDuration := 1 * time.Second + + if err = redis.Set("username", "silenceper", timeoutDuration); err != nil { + t.Error("set Error", err) + } + + if !redis.IsExist("username") { + t.Error("IsExist Error") + } + + name := redis.Get("username").(string) + if name != "silenceper" { + t.Error("get Error") + } + + if err = redis.Delete("username"); err != nil { + t.Errorf("delete Error , err=%v", err) + } +}