diff --git a/cache/memcache.go b/cache/memcache.go index 15d3649c..365c5de7 100644 --- a/cache/memcache.go +++ b/cache/memcache.go @@ -21,7 +21,11 @@ func NewMemCache() *MemcacheCache { // get value from memcache. func (rc *MemcacheCache) Get(key string) interface{} { if rc.c == nil { - rc.c = rc.connectInit() + var err error + rc.c, err = rc.connectInit() + if err != nil { + return err + } } v, err := rc.c.Get(key) if err != nil { @@ -39,7 +43,11 @@ func (rc *MemcacheCache) Get(key string) interface{} { // put value to memcache. only support string. func (rc *MemcacheCache) Put(key string, val interface{}, timeout int64) error { if rc.c == nil { - rc.c = rc.connectInit() + var err error + rc.c, err = rc.connectInit() + if err != nil { + return err + } } v, ok := val.(string) if !ok { @@ -55,7 +63,11 @@ func (rc *MemcacheCache) Put(key string, val interface{}, timeout int64) error { // delete value in memcache. func (rc *MemcacheCache) Delete(key string) error { if rc.c == nil { - rc.c = rc.connectInit() + var err error + rc.c, err = rc.connectInit() + if err != nil { + return err + } } _, err := rc.c.Delete(key) return err @@ -76,7 +88,11 @@ func (rc *MemcacheCache) Decr(key string) error { // check value exists in memcache. func (rc *MemcacheCache) IsExist(key string) bool { if rc.c == nil { - rc.c = rc.connectInit() + var err error + rc.c, err = rc.connectInit() + if err != nil { + return false + } } v, err := rc.c.Get(key) if err != nil { @@ -93,7 +109,11 @@ func (rc *MemcacheCache) IsExist(key string) bool { // clear all cached in memcache. func (rc *MemcacheCache) ClearAll() error { if rc.c == nil { - rc.c = rc.connectInit() + var err error + rc.c, err = rc.connectInit() + if err != nil { + return err + } } err := rc.c.FlushAll() return err @@ -109,20 +129,21 @@ func (rc *MemcacheCache) StartAndGC(config string) error { return errors.New("config has no conn key") } rc.conninfo = cf["conn"] - rc.c = rc.connectInit() - if rc.c == nil { + var err error + rc.c, err = rc.connectInit() + if err != nil { return errors.New("dial tcp conn error") } return nil } // connect to memcache and keep the connection. -func (rc *MemcacheCache) connectInit() *memcache.Connection { +func (rc *MemcacheCache) connectInit() (*memcache.Connection, error) { c, err := memcache.Connect(rc.conninfo) if err != nil { - return nil + return nil, err } - return c + return c, nil } func init() { diff --git a/cache/redis.go b/cache/redis.go index b923a6df..0fac0deb 100644 --- a/cache/redis.go +++ b/cache/redis.go @@ -3,6 +3,7 @@ package cache import ( "encoding/json" "errors" + "io" "github.com/beego/redigo/redis" ) @@ -33,10 +34,18 @@ func (rc *RedisCache) Get(key string) interface{} { return nil } } + v, err := rc.c.Do("HGET", rc.key, key) + // write to closed socket, reset rc.c to nil + if err == io.EOF { + rc.c = nil + return nil + } + if err != nil { return nil } + return v } @@ -50,7 +59,14 @@ func (rc *RedisCache) Put(key string, val interface{}, timeout int64) error { return err } } + _, err := rc.c.Do("HSET", rc.key, key, val) + // write to closed socket, reset rc.c to nil + if err == io.EOF { + rc.c = nil + return err + } + return err } @@ -63,7 +79,14 @@ func (rc *RedisCache) Delete(key string) error { return err } } + _, err := rc.c.Do("HDEL", rc.key, key) + // write to closed socket, reset rc.c to nil + if err == io.EOF { + rc.c = nil + return err + } + return err } @@ -76,10 +99,18 @@ func (rc *RedisCache) IsExist(key string) bool { return false } } + v, err := redis.Bool(rc.c.Do("HEXISTS", rc.key, key)) + // write to closed socket, reset rc.c to nil + if err == io.EOF { + rc.c = nil + return false + } + if err != nil { return false } + return v } @@ -92,11 +123,14 @@ func (rc *RedisCache) Incr(key string) error { return err } } + _, err := redis.Bool(rc.c.Do("HINCRBY", rc.key, key, 1)) - if err != nil { - return err + // write to closed socket + if err == io.EOF { + rc.c = nil } - return nil + + return err } // decrease counter in redis. @@ -108,11 +142,15 @@ func (rc *RedisCache) Decr(key string) error { return err } } + _, err := redis.Bool(rc.c.Do("HINCRBY", rc.key, key, -1)) - if err != nil { - return err + + // write to closed socket + if err == io.EOF { + rc.c = nil } - return nil + + return err } // clean all cache in redis. delete this redis collection. @@ -124,7 +162,13 @@ func (rc *RedisCache) ClearAll() error { return err } } + _, err := rc.c.Do("DEL", rc.key) + // write to closed socket + if err == io.EOF { + rc.c = nil + } + return err }