060631e9 by astaxie

fix #241#192

1 parent 57165f2f
...@@ -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++ {
69 c, err := redis.Dial("tcp", rp.savePath)
70 if err != nil {
71 fmt.Println(err)
72 return
73 } 75 }
74 putRedis(c) 76 } else {
77 rp.poolsize = MAX_POOL_SIZE
75 } 78 }
76 }() 79 if len(configs) > 2 {
80 rp.password = configs[2]
77 } 81 }
78 return <-redisPool 82 rp.poollist = redis.NewPool(func() (redis.Conn, error) {
79 } 83 c, err := redis.Dial("tcp", rp.savePath)
80 84 if err != nil {
81 func putRedis(conn redis.Conn) { 85 return nil, err
82 if redisPool == nil {
83 redisPool = make(chan redis.Conn, MAX_POOL_SIZE)
84 } 86 }
85 if len(redisPool) >= MAX_POOL_SIZE { 87 if rp.password != "" {
86 conn.Close() 88 if _, err := c.Do("AUTH", rp.password); err != nil {
87 return 89 c.Close()
90 return nil, err
88 } 91 }
89 redisPool <- conn 92 }
90 } 93 return c, err
91 94 }, rp.poolsize)
92 func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error {
93 rp.maxlifetime = maxlifetime
94 rp.savePath = savePath
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 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!