From a2dd859e555dc3ca8fdb8bf5d864085bc45fe3ef Mon Sep 17 00:00:00 2001 From: yecrane Date: Tue, 14 May 2013 23:55:50 +0800 Subject: [PATCH] Update sess_redis.go --- session/sess_redis.go | 45 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/session/sess_redis.go b/session/sess_redis.go index 9d3dcd96..06499db6 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -6,18 +6,24 @@ import ( var redispder = &RedisProvider{} +var MAX_POOL_SIZE = 20 + +var redisPool chan redis.Conn + type RedisSessionStore struct { c redis.Conn sid string } func (rs *RedisSessionStore) Set(key, value interface{}) error { + //_, err := rs.c.Do("HSET", rs.sid, key, value) _, err := rs.c.Do("HSET", rs.sid, key, value) return err } func (rs *RedisSessionStore) Get(key interface{}) interface{} { - v, err := rs.c.Do("GET", rs.sid, key) + //v, err := rs.c.Do("GET", rs.sid, key) + v, err := redis.String(rs.c.Do("HGET", rs.sid, key)) if err != nil { return nil } @@ -25,6 +31,7 @@ func (rs *RedisSessionStore) Get(key interface{}) interface{} { } func (rs *RedisSessionStore) Delete(key interface{}) error { + //_, err := rs.c.Do("HDEL", rs.sid, key) _, err := rs.c.Do("HDEL", rs.sid, key) return err } @@ -43,11 +50,37 @@ type RedisProvider struct { } func (rp *RedisProvider) connectInit() redis.Conn { - c, err := redis.Dial("tcp", rp.savePath) + /*c, err := redis.Dial("tcp", rp.savePath) if err != nil { return nil } - return c + return c*/ + if redisPool == nil { + redisPool = make(chan redis.Conn, MAX_POOL_SIZE) + } + if len(redisPool) == 0 { + go func() { + for i := 0; i < MAX_POOL_SIZE/2; i++ { + c, err := redis.Dial("tcp", rp.savePath) + if err != nil { + panic(err) + } + putRedis(c) + } + }() + } + return <-redisPool +} + +func putRedis(conn redis.Conn) { + if redisPool == nil { + redisPool = make(chan redis.Conn, MAX_POOL_SIZE) + } + if len(redisPool) == MAX_POOL_SIZE { + conn.Close() + return + } + redisPool <- conn } func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { @@ -58,8 +91,10 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { c := rp.connectInit() - if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { - c.Do("SET", sid, sid, rp.maxlifetime) + //if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { + if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { + //c.Do("SET", sid, sid, rp.maxlifetime) + c.Do("HSET", sid, sid, rp.maxlifetime) } rs := &RedisSessionStore{c: c, sid: sid} return rs, nil