func TestRedisCache(t *testing.T) { bm, err := cache.NewCache("redis", `{"conn": "127.0.0.1:6379"}`) if err != nil { t.Error("init err") } if err = bm.Put("astaxie", 1, 10); err != nil { t.Error("set Error", err) } if !bm.IsExist("astaxie") { t.Error("check err") } time.Sleep(10 * time.Second) if bm.IsExist("astaxie") { t.Error("check err") } if err = bm.Put("astaxie", 1, 10); err != nil { t.Error("set Error", err) } if v, _ := redis.Int(bm.Get("astaxie"), err); v != 1 { t.Error("get err") } if err = bm.Incr("astaxie"); err != nil { t.Error("Incr Error", err) } if v, _ := redis.Int(bm.Get("astaxie"), err); v != 2 { t.Error("get err") } if err = bm.Decr("astaxie"); err != nil { t.Error("Decr Error", err) } if v, _ := redis.Int(bm.Get("astaxie"), err); v != 1 { t.Error("get err") } bm.Delete("astaxie") if bm.IsExist("astaxie") { t.Error("delete err") } //test string if err = bm.Put("astaxie", "author", 10); err != nil { t.Error("set Error", err) } if !bm.IsExist("astaxie") { t.Error("check err") } if v, _ := redis.String(bm.Get("astaxie"), err); v != "author" { t.Error("get err") } // test clear all if err = bm.ClearAll(); err != nil { t.Error("clear all err") } }
// generate new sid for redis session func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (session.SessionStore, error) { c := rp.poollist.Get() defer c.Close() if existed, _ := redis.Int(c.Do("EXISTS", oldsid)); existed == 0 { // oldsid doesn't exists, set the new sid directly // ignore error here, since if it return error // the existed value will be 0 c.Do("SET", sid, "", "EX", rp.maxlifetime) } else { c.Do("RENAME", oldsid, sid) c.Do("EXPIRE", sid, rp.maxlifetime) } kvs, err := redis.String(c.Do("GET", sid)) var kv map[interface{}]interface{} if len(kvs) == 0 { kv = make(map[interface{}]interface{}) } else { kv, err = session.DecodeGob([]byte(kvs)) if err != nil { return nil, err } } rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime} return rs, nil }
// generate new sid for redis session func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (session.SessionStore, error) { c := rp.poollist.Get() defer c.Close() if existed, _ := redis.Int(c.Do("EXISTS", oldsid)); existed == 0 { // oldsid doesn't exists, set the new sid directly // ignore error here, since if it return error // the existed value will be 0 c.Do("SET", sid, "", "EX", rp.maxlifetime) } else { c.Do("RENAME", oldsid, sid) c.Do("EXPIRE", sid, rp.maxlifetime) } kvs, err := redis.String(c.Do("GET", sid)) var kv map[string]interface{} if len(kvs) == 0 { kv = make(map[string]interface{}) } else { err = json.Unmarshal([]byte(kvs), &kv) //var b []byte //err = n_code.BinaryPackDecode(kv, b, n_code.MsgpackHandle) if err != nil { beego.Debug("err", err) return nil, err } } rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime} return rs, nil }
func (rp *RedisProvider) SessionExist(sid string) bool { c := rp.poollist.Get() if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { return false } else { return true } }
func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { c := rp.poollist.Get() if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { c.Do("SET", sid) } c.Do("EXPIRE", sid, rp.maxlifetime) kvs, err := redis.String(c.Do("GET", sid)) var kv map[interface{}]interface{} if len(kvs) == 0 { kv = make(map[interface{}]interface{}) } else { kv, err = decodeGob([]byte(kvs)) if err != nil { return nil, err } } rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} return rs, nil }