Update sess_redis.go
Showing
1 changed file
with
40 additions
and
5 deletions
| ... | @@ -6,18 +6,24 @@ import ( | ... | @@ -6,18 +6,24 @@ import ( |
| 6 | 6 | ||
| 7 | var redispder = &RedisProvider{} | 7 | var redispder = &RedisProvider{} |
| 8 | 8 | ||
| 9 | var MAX_POOL_SIZE = 20 | ||
| 10 | |||
| 11 | var redisPool chan redis.Conn | ||
| 12 | |||
| 9 | type RedisSessionStore struct { | 13 | type RedisSessionStore struct { |
| 10 | c redis.Conn | 14 | c redis.Conn |
| 11 | sid string | 15 | sid string |
| 12 | } | 16 | } |
| 13 | 17 | ||
| 14 | func (rs *RedisSessionStore) Set(key, value interface{}) error { | 18 | func (rs *RedisSessionStore) Set(key, value interface{}) error { |
| 19 | //_, err := rs.c.Do("HSET", rs.sid, key, value) | ||
| 15 | _, err := rs.c.Do("HSET", rs.sid, key, value) | 20 | _, err := rs.c.Do("HSET", rs.sid, key, value) |
| 16 | return err | 21 | return err |
| 17 | } | 22 | } |
| 18 | 23 | ||
| 19 | func (rs *RedisSessionStore) Get(key interface{}) interface{} { | 24 | func (rs *RedisSessionStore) Get(key interface{}) interface{} { |
| 20 | v, err := rs.c.Do("GET", rs.sid, key) | 25 | //v, err := rs.c.Do("GET", rs.sid, key) |
| 26 | v, err := redis.String(rs.c.Do("HGET", rs.sid, key)) | ||
| 21 | if err != nil { | 27 | if err != nil { |
| 22 | return nil | 28 | return nil |
| 23 | } | 29 | } |
| ... | @@ -25,6 +31,7 @@ func (rs *RedisSessionStore) Get(key interface{}) interface{} { | ... | @@ -25,6 +31,7 @@ func (rs *RedisSessionStore) Get(key interface{}) interface{} { |
| 25 | } | 31 | } |
| 26 | 32 | ||
| 27 | func (rs *RedisSessionStore) Delete(key interface{}) error { | 33 | func (rs *RedisSessionStore) Delete(key interface{}) error { |
| 34 | //_, err := rs.c.Do("HDEL", rs.sid, key) | ||
| 28 | _, err := rs.c.Do("HDEL", rs.sid, key) | 35 | _, err := rs.c.Do("HDEL", rs.sid, key) |
| 29 | return err | 36 | return err |
| 30 | } | 37 | } |
| ... | @@ -43,11 +50,37 @@ type RedisProvider struct { | ... | @@ -43,11 +50,37 @@ type RedisProvider struct { |
| 43 | } | 50 | } |
| 44 | 51 | ||
| 45 | func (rp *RedisProvider) connectInit() redis.Conn { | 52 | func (rp *RedisProvider) connectInit() redis.Conn { |
| 46 | c, err := redis.Dial("tcp", rp.savePath) | 53 | /*c, err := redis.Dial("tcp", rp.savePath) |
| 47 | if err != nil { | 54 | if err != nil { |
| 48 | return nil | 55 | return nil |
| 49 | } | 56 | } |
| 50 | return c | 57 | return c*/ |
| 58 | if redisPool == nil { | ||
| 59 | redisPool = make(chan redis.Conn, MAX_POOL_SIZE) | ||
| 60 | } | ||
| 61 | if len(redisPool) == 0 { | ||
| 62 | go func() { | ||
| 63 | for i := 0; i < MAX_POOL_SIZE/2; i++ { | ||
| 64 | c, err := redis.Dial("tcp", rp.savePath) | ||
| 65 | if err != nil { | ||
| 66 | panic(err) | ||
| 67 | } | ||
| 68 | putRedis(c) | ||
| 69 | } | ||
| 70 | }() | ||
| 71 | } | ||
| 72 | return <-redisPool | ||
| 73 | } | ||
| 74 | |||
| 75 | func putRedis(conn redis.Conn) { | ||
| 76 | if redisPool == nil { | ||
| 77 | redisPool = make(chan redis.Conn, MAX_POOL_SIZE) | ||
| 78 | } | ||
| 79 | if len(redisPool) == MAX_POOL_SIZE { | ||
| 80 | conn.Close() | ||
| 81 | return | ||
| 82 | } | ||
| 83 | redisPool <- conn | ||
| 51 | } | 84 | } |
| 52 | 85 | ||
| 53 | func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { | 86 | func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { |
| ... | @@ -58,8 +91,10 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { | ... | @@ -58,8 +91,10 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { |
| 58 | 91 | ||
| 59 | func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { | 92 | func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { |
| 60 | c := rp.connectInit() | 93 | c := rp.connectInit() |
| 61 | if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { | 94 | //if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { |
| 62 | c.Do("SET", sid, sid, rp.maxlifetime) | 95 | if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { |
| 96 | //c.Do("SET", sid, sid, rp.maxlifetime) | ||
| 97 | c.Do("HSET", sid, sid, rp.maxlifetime) | ||
| 63 | } | 98 | } |
| 64 | rs := &RedisSessionStore{c: c, sid: sid} | 99 | rs := &RedisSessionStore{c: c, sid: sid} |
| 65 | return rs, nil | 100 | return rs, nil | ... | ... |
-
Please register or sign in to post a comment