fix #241#192
Showing
2 changed files
with
44 additions
and
42 deletions
| ... | @@ -39,10 +39,10 @@ Then in you web app init the global session manager | ... | @@ -39,10 +39,10 @@ Then in you web app init the global session manager |
| 39 | go globalSessions.GC() | 39 | go globalSessions.GC() |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | * Use **Redis** as provider, the last param is the Redis conn address: | 42 | * Use **Redis** as provider, the last param is the Redis conn address,poolsize,password: |
| 43 | 43 | ||
| 44 | func init() { | 44 | func init() { |
| 45 | globalSessions, _ = session.NewManager("redis", "gosessionid", 3600, "127.0.0.1:6379") | 45 | globalSessions, _ = session.NewManager("redis", "gosessionid", 3600, "127.0.0.1:6379,100,astaxie") |
| 46 | go globalSessions.GC() | 46 | go globalSessions.GC() |
| 47 | } | 47 | } |
| 48 | 48 | ... | ... |
| 1 | package session | 1 | package session |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | ||
| 5 | "github.com/garyburd/redigo/redis" | 4 | "github.com/garyburd/redigo/redis" |
| 5 | "strconv" | ||
| 6 | "strings" | ||
| 6 | ) | 7 | ) |
| 7 | 8 | ||
| 8 | var redispder = &RedisProvider{} | 9 | var redispder = &RedisProvider{} |
| 9 | 10 | ||
| 10 | var MAX_POOL_SIZE = 20 | 11 | var MAX_POOL_SIZE = 100 |
| 11 | 12 | ||
| 12 | var redisPool chan redis.Conn | 13 | var redisPool chan redis.Conn |
| 13 | 14 | ||
| ... | @@ -52,72 +53,73 @@ func (rs *RedisSessionStore) SessionRelease() { | ... | @@ -52,72 +53,73 @@ func (rs *RedisSessionStore) SessionRelease() { |
| 52 | type RedisProvider struct { | 53 | type RedisProvider struct { |
| 53 | maxlifetime int64 | 54 | maxlifetime int64 |
| 54 | savePath string | 55 | savePath string |
| 56 | poolsize int | ||
| 57 | password string | ||
| 58 | poollist *redis.Pool | ||
| 55 | } | 59 | } |
| 56 | 60 | ||
| 57 | func (rp *RedisProvider) connectInit() redis.Conn { | 61 | //savepath like redisserveraddr,poolsize,password |
| 58 | /*c, err := redis.Dial("tcp", rp.savePath) | 62 | //127.0.0.1:6379,100,astaxie |
| 59 | if err != nil { | 63 | func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { |
| 60 | return nil | 64 | rp.maxlifetime = maxlifetime |
| 65 | configs := strings.Split(savePath, ",") | ||
| 66 | if len(configs) > 0 { | ||
| 67 | rp.savePath = configs[0] | ||
| 61 | } | 68 | } |
| 62 | return c*/ | 69 | if len(configs) > 1 { |
| 63 | //if redisPool == nil { | 70 | poolsize, err := strconv.Atoi(configs[1]) |
| 64 | redisPool = make(chan redis.Conn, MAX_POOL_SIZE) | 71 | if err != nil || poolsize <= 0 { |
| 65 | //} | 72 | rp.poolsize = MAX_POOL_SIZE |
| 66 | if len(redisPool) == 0 { | 73 | } else { |
| 67 | go func() { | 74 | rp.poolsize = poolsize |
| 68 | for i := 0; i < MAX_POOL_SIZE/2; i++ { | 75 | } |
| 69 | c, err := redis.Dial("tcp", rp.savePath) | 76 | } else { |
| 70 | if err != nil { | 77 | rp.poolsize = MAX_POOL_SIZE |
| 71 | fmt.Println(err) | ||
| 72 | return | ||
| 73 | } | ||
| 74 | putRedis(c) | ||
| 75 | } | ||
| 76 | }() | ||
| 77 | } | 78 | } |
| 78 | return <-redisPool | 79 | if len(configs) > 2 { |
| 79 | } | 80 | rp.password = configs[2] |
| 80 | |||
| 81 | func putRedis(conn redis.Conn) { | ||
| 82 | if redisPool == nil { | ||
| 83 | redisPool = make(chan redis.Conn, MAX_POOL_SIZE) | ||
| 84 | } | 81 | } |
| 85 | if len(redisPool) >= MAX_POOL_SIZE { | 82 | rp.poollist = redis.NewPool(func() (redis.Conn, error) { |
| 86 | conn.Close() | 83 | c, err := redis.Dial("tcp", rp.savePath) |
| 87 | return | 84 | if err != nil { |
| 88 | } | 85 | return nil, err |
| 89 | redisPool <- conn | 86 | } |
| 90 | } | 87 | if rp.password != "" { |
| 91 | 88 | if _, err := c.Do("AUTH", rp.password); err != nil { | |
| 92 | func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { | 89 | c.Close() |
| 93 | rp.maxlifetime = maxlifetime | 90 | return nil, err |
| 94 | rp.savePath = savePath | 91 | } |
| 92 | } | ||
| 93 | return c, err | ||
| 94 | }, rp.poolsize) | ||
| 95 | return nil | 95 | return nil |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { | 98 | func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { |
| 99 | c := rp.connectInit() | 99 | c := rp.poollist.Get() |
| 100 | //if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { | 100 | //if str, err := redis.String(c.Do("GET", sid)); err != nil || str == "" { |
| 101 | if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { | 101 | if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" { |
| 102 | //c.Do("SET", sid, sid, rp.maxlifetime) | 102 | //c.Do("SET", sid, sid, rp.maxlifetime) |
| 103 | c.Do("HSET", sid, sid, rp.maxlifetime) | 103 | c.Do("HSET", sid, sid, rp.maxlifetime) |
| 104 | } | 104 | } |
| 105 | c.Do("EXPIRE", sid, rp.maxlifetime) | ||
| 105 | rs := &RedisSessionStore{c: c, sid: sid} | 106 | rs := &RedisSessionStore{c: c, sid: sid} |
| 106 | return rs, nil | 107 | return rs, nil |
| 107 | } | 108 | } |
| 108 | 109 | ||
| 109 | func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { | 110 | func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { |
| 110 | c := rp.connectInit() | 111 | c := rp.poollist.Get() |
| 111 | if str, err := redis.String(c.Do("HGET", oldsid, oldsid)); err != nil || str == "" { | 112 | if str, err := redis.String(c.Do("HGET", oldsid, oldsid)); err != nil || str == "" { |
| 112 | c.Do("HSET", oldsid, oldsid, rp.maxlifetime) | 113 | c.Do("HSET", oldsid, oldsid, rp.maxlifetime) |
| 113 | } | 114 | } |
| 114 | c.Do("RENAME", oldsid, sid) | 115 | c.Do("RENAME", oldsid, sid) |
| 116 | c.Do("EXPIRE", sid, rp.maxlifetime) | ||
| 115 | rs := &RedisSessionStore{c: c, sid: sid} | 117 | rs := &RedisSessionStore{c: c, sid: sid} |
| 116 | return rs, nil | 118 | return rs, nil |
| 117 | } | 119 | } |
| 118 | 120 | ||
| 119 | func (rp *RedisProvider) SessionDestroy(sid string) error { | 121 | func (rp *RedisProvider) SessionDestroy(sid string) error { |
| 120 | c := rp.connectInit() | 122 | c := rp.poollist.Get() |
| 121 | c.Do("DEL", sid) | 123 | c.Do("DEL", sid) |
| 122 | return nil | 124 | return nil |
| 123 | } | 125 | } | ... | ... |
-
Please register or sign in to post a comment