1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-14 17:20:56 +00:00
Beego/session/sess_redis.go

188 lines
3.9 KiB
Go
Raw Normal View History

package session
import (
2014-01-05 06:48:36 +00:00
"net/http"
2013-10-28 14:19:37 +00:00
"strconv"
"strings"
2013-11-05 13:59:35 +00:00
"sync"
2013-12-03 13:37:39 +00:00
"github.com/beego/redigo/redis"
)
var redispder = &RedisProvider{}
2013-10-28 14:19:37 +00:00
var MAX_POOL_SIZE = 100
2013-05-14 15:55:50 +00:00
var redisPool chan redis.Conn
type RedisSessionStore struct {
2013-12-14 15:29:17 +00:00
c redis.Conn
sid string
lock sync.RWMutex
values map[interface{}]interface{}
maxlifetime int64
}
func (rs *RedisSessionStore) Set(key, value interface{}) error {
2013-11-05 13:59:35 +00:00
rs.lock.Lock()
defer rs.lock.Unlock()
rs.values[key] = value
return nil
}
func (rs *RedisSessionStore) Get(key interface{}) interface{} {
2013-11-05 13:59:35 +00:00
rs.lock.RLock()
defer rs.lock.RUnlock()
if v, ok := rs.values[key]; ok {
return v
} else {
return nil
}
2013-11-05 13:59:35 +00:00
return nil
}
func (rs *RedisSessionStore) Delete(key interface{}) error {
2013-11-05 13:59:35 +00:00
rs.lock.Lock()
defer rs.lock.Unlock()
delete(rs.values, key)
return nil
}
2013-09-26 10:07:00 +00:00
func (rs *RedisSessionStore) Flush() error {
2013-11-05 13:59:35 +00:00
rs.lock.Lock()
defer rs.lock.Unlock()
rs.values = make(map[interface{}]interface{})
return nil
2013-09-26 10:07:00 +00:00
}
func (rs *RedisSessionStore) SessionID() string {
return rs.sid
}
2014-01-05 06:48:36 +00:00
func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) {
2013-11-05 13:59:35 +00:00
defer rs.c.Close()
b, err := encodeGob(rs.values)
if err != nil {
return
2013-11-05 13:59:35 +00:00
}
rs.c.Do("SET", rs.sid, string(b))
rs.c.Do("EXPIRE", rs.sid, rs.maxlifetime)
}
type RedisProvider struct {
maxlifetime int64
savePath string
2013-10-28 14:19:37 +00:00
poolsize int
password string
poollist *redis.Pool
}
2013-10-28 14:19:37 +00:00
//savepath like redisserveraddr,poolsize,password
//127.0.0.1:6379,100,astaxie
func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error {
rp.maxlifetime = maxlifetime
configs := strings.Split(savePath, ",")
if len(configs) > 0 {
rp.savePath = configs[0]
}
2013-10-28 14:19:37 +00:00
if len(configs) > 1 {
poolsize, err := strconv.Atoi(configs[1])
if err != nil || poolsize <= 0 {
rp.poolsize = MAX_POOL_SIZE
} else {
rp.poolsize = poolsize
}
} else {
rp.poolsize = MAX_POOL_SIZE
2013-05-14 15:55:50 +00:00
}
2013-10-28 14:19:37 +00:00
if len(configs) > 2 {
rp.password = configs[2]
2013-05-14 15:55:50 +00:00
}
2013-10-28 14:19:37 +00:00
rp.poollist = redis.NewPool(func() (redis.Conn, error) {
c, err := redis.Dial("tcp", rp.savePath)
if err != nil {
return nil, err
}
if rp.password != "" {
if _, err := c.Do("AUTH", rp.password); err != nil {
c.Close()
return nil, err
}
}
return c, err
}, rp.poolsize)
return nil
}
func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) {
2013-10-28 14:19:37 +00:00
c := rp.poollist.Get()
2013-11-05 15:41:01 +00:00
if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
c.Do("SET", sid)
}
2013-10-28 14:19:37 +00:00
c.Do("EXPIRE", sid, rp.maxlifetime)
2013-11-05 15:41:01 +00:00
kvs, err := redis.String(c.Do("GET", sid))
var kv map[interface{}]interface{}
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
kv, err = decodeGob([]byte(kvs))
if err != nil {
return nil, err
2013-11-05 13:59:35 +00:00
}
}
2013-12-14 15:29:17 +00:00
rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime}
return rs, nil
}
2013-11-05 14:23:48 +00:00
func (rp *RedisProvider) SessionExist(sid string) bool {
c := rp.poollist.Get()
2013-12-14 15:29:17 +00:00
defer c.Close()
2013-11-05 15:41:01 +00:00
if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
2013-11-05 14:23:48 +00:00
return false
} else {
return true
}
}
2013-09-26 10:07:00 +00:00
func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
2013-10-28 14:19:37 +00:00
c := rp.poollist.Get()
2013-11-05 15:41:01 +00:00
if existed, err := redis.Int(c.Do("EXISTS", oldsid)); err != nil || existed == 0 {
c.Do("SET", oldsid)
2013-09-26 10:07:00 +00:00
}
c.Do("RENAME", oldsid, sid)
2013-10-28 14:19:37 +00:00
c.Do("EXPIRE", sid, rp.maxlifetime)
2013-11-05 15:41:01 +00:00
kvs, err := redis.String(c.Do("GET", sid))
var kv map[interface{}]interface{}
if len(kvs) == 0 {
kv = make(map[interface{}]interface{})
} else {
kv, err = decodeGob([]byte(kvs))
if err != nil {
return nil, err
2013-11-05 13:59:35 +00:00
}
}
2013-12-14 15:29:17 +00:00
rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime}
2013-09-26 10:07:00 +00:00
return rs, nil
}
func (rp *RedisProvider) SessionDestroy(sid string) error {
2013-10-28 14:19:37 +00:00
c := rp.poollist.Get()
2013-12-14 15:29:17 +00:00
defer c.Close()
c.Do("DEL", sid)
return nil
}
func (rp *RedisProvider) SessionGC() {
return
}
2013-11-01 16:16:10 +00:00
//@todo
func (rp *RedisProvider) SessionAll() int {
return 0
}
func init() {
Register("redis", redispder)
}