Merge pull request #1 from chliang2030598/master
add session store in ledis
Showing
1 changed file
with
168 additions
and
0 deletions
session/ledis/ledis_session.go
0 → 100644
| 1 | package session | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "net/http" | ||
| 5 | "sync" | ||
| 6 | |||
| 7 | "github.com/astaxie/beego/session" | ||
| 8 | "github.com/siddontang/ledisdb/config" | ||
| 9 | "github.com/siddontang/ledisdb/ledis" | ||
| 10 | ) | ||
| 11 | |||
| 12 | var ledispder = &LedisProvider{} | ||
| 13 | var c *ledis.DB | ||
| 14 | |||
| 15 | // ledis session store | ||
| 16 | type LedisSessionStore struct { | ||
| 17 | sid string | ||
| 18 | lock sync.RWMutex | ||
| 19 | values map[interface{}]interface{} | ||
| 20 | maxlifetime int64 | ||
| 21 | } | ||
| 22 | |||
| 23 | // set value in ledis session | ||
| 24 | func (ls *LedisSessionStore) Set(key, value interface{}) error { | ||
| 25 | ls.lock.Lock() | ||
| 26 | defer ls.lock.Unlock() | ||
| 27 | ls.values[key] = value | ||
| 28 | return nil | ||
| 29 | } | ||
| 30 | |||
| 31 | // get value in ledis session | ||
| 32 | func (ls *LedisSessionStore) Get(key interface{}) interface{} { | ||
| 33 | ls.lock.RLock() | ||
| 34 | defer ls.lock.RUnlock() | ||
| 35 | if v, ok := ls.values[key]; ok { | ||
| 36 | return v | ||
| 37 | } else { | ||
| 38 | return nil | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | // delete value in ledis session | ||
| 43 | func (ls *LedisSessionStore) Delete(key interface{}) error { | ||
| 44 | ls.lock.Lock() | ||
| 45 | defer ls.lock.Unlock() | ||
| 46 | delete(ls.values, key) | ||
| 47 | return nil | ||
| 48 | } | ||
| 49 | |||
| 50 | // clear all values in ledis session | ||
| 51 | func (ls *LedisSessionStore) Flush() error { | ||
| 52 | ls.lock.Lock() | ||
| 53 | defer ls.lock.Unlock() | ||
| 54 | ls.values = make(map[interface{}]interface{}) | ||
| 55 | return nil | ||
| 56 | } | ||
| 57 | |||
| 58 | // get ledis session id | ||
| 59 | func (ls *LedisSessionStore) SessionID() string { | ||
| 60 | return ls.sid | ||
| 61 | } | ||
| 62 | |||
| 63 | // save session values to ledis | ||
| 64 | func (ls *LedisSessionStore) SessionRelease(w http.ResponseWriter) { | ||
| 65 | b, err := session.EncodeGob(ls.values) | ||
| 66 | if err != nil { | ||
| 67 | return | ||
| 68 | } | ||
| 69 | c.Set([]byte(ls.sid), b) | ||
| 70 | c.Expire([]byte(ls.sid), ls.maxlifetime) | ||
| 71 | } | ||
| 72 | |||
| 73 | // ledis session provider | ||
| 74 | type LedisProvider struct { | ||
| 75 | maxlifetime int64 | ||
| 76 | savePath string | ||
| 77 | } | ||
| 78 | |||
| 79 | // init ledis session | ||
| 80 | // savepath like ledis server saveDataPath,pool size | ||
| 81 | // e.g. 127.0.0.1:6379,100,astaxie | ||
| 82 | func (lp *LedisProvider) SessionInit(maxlifetime int64, savePath string) error { | ||
| 83 | lp.maxlifetime = maxlifetime | ||
| 84 | lp.savePath = savePath | ||
| 85 | cfg := new(config.Config) | ||
| 86 | cfg.DataDir = lp.savePath | ||
| 87 | var err error | ||
| 88 | nowLedis, err := ledis.Open(cfg) | ||
| 89 | c, err = nowLedis.Select(0) | ||
| 90 | if err != nil { | ||
| 91 | println(err) | ||
| 92 | return nil | ||
| 93 | } | ||
| 94 | return nil | ||
| 95 | } | ||
| 96 | |||
| 97 | // read ledis session by sid | ||
| 98 | func (lp *LedisProvider) SessionRead(sid string) (session.SessionStore, error) { | ||
| 99 | kvs, err := c.Get([]byte(sid)) | ||
| 100 | var kv map[interface{}]interface{} | ||
| 101 | if len(kvs) == 0 { | ||
| 102 | kv = make(map[interface{}]interface{}) | ||
| 103 | } else { | ||
| 104 | kv, err = session.DecodeGob(kvs) | ||
| 105 | if err != nil { | ||
| 106 | return nil, err | ||
| 107 | } | ||
| 108 | } | ||
| 109 | ls := &LedisSessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime} | ||
| 110 | return ls, nil | ||
| 111 | } | ||
| 112 | |||
| 113 | // check ledis session exist by sid | ||
| 114 | func (lp *LedisProvider) SessionExist(sid string) bool { | ||
| 115 | count, _ := c.Exists([]byte(sid)) | ||
| 116 | if count == 0 { | ||
| 117 | return false | ||
| 118 | } else { | ||
| 119 | return true | ||
| 120 | } | ||
| 121 | } | ||
| 122 | |||
| 123 | // generate new sid for ledis session | ||
| 124 | func (lp *LedisProvider) SessionRegenerate(oldsid, sid string) (session.SessionStore, error) { | ||
| 125 | count, _ := c.Exists([]byte(sid)) | ||
| 126 | if count == 0 { | ||
| 127 | // oldsid doesn't exists, set the new sid directly | ||
| 128 | // ignore error here, since if it return error | ||
| 129 | // the existed value will be 0 | ||
| 130 | c.Set([]byte(sid), []byte("")) | ||
| 131 | c.Expire([]byte(sid), lp.maxlifetime) | ||
| 132 | } else { | ||
| 133 | data, _ := c.Get([]byte(oldsid)) | ||
| 134 | c.Set([]byte(sid), data) | ||
| 135 | c.Expire([]byte(sid), lp.maxlifetime) | ||
| 136 | } | ||
| 137 | kvs, err := c.Get([]byte(sid)) | ||
| 138 | var kv map[interface{}]interface{} | ||
| 139 | if len(kvs) == 0 { | ||
| 140 | kv = make(map[interface{}]interface{}) | ||
| 141 | } else { | ||
| 142 | kv, err = session.DecodeGob([]byte(kvs)) | ||
| 143 | if err != nil { | ||
| 144 | return nil, err | ||
| 145 | } | ||
| 146 | } | ||
| 147 | ls := &LedisSessionStore{sid: sid, values: kv, maxlifetime: lp.maxlifetime} | ||
| 148 | return ls, nil | ||
| 149 | } | ||
| 150 | |||
| 151 | // delete ledis session by id | ||
| 152 | func (lp *LedisProvider) SessionDestroy(sid string) error { | ||
| 153 | c.Del([]byte(sid)) | ||
| 154 | return nil | ||
| 155 | } | ||
| 156 | |||
| 157 | // Impelment method, no used. | ||
| 158 | func (lp *LedisProvider) SessionGC() { | ||
| 159 | return | ||
| 160 | } | ||
| 161 | |||
| 162 | // @todo | ||
| 163 | func (lp *LedisProvider) SessionAll() int { | ||
| 164 | return 0 | ||
| 165 | } | ||
| 166 | func init() { | ||
| 167 | session.Register("ledis", ledispder) | ||
| 168 | } |
-
Please register or sign in to post a comment