a2dd859e by yecrane

Update sess_redis.go

1 parent 4d06fec5
...@@ -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
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!