W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
上一節(jié)我們介紹了Session管理器的實(shí)現(xiàn)原理,定義了存儲(chǔ)session的接口,這小節(jié)我們將示例一個(gè)基于內(nèi)存的session存儲(chǔ)接口的實(shí)現(xiàn),其他的存儲(chǔ)方式,讀者可以自行參考示例來(lái)實(shí)現(xiàn),內(nèi)存的實(shí)現(xiàn)請(qǐng)看下面的例子代碼
package memory
import (
"container/list"
"github.com/astaxie/session"
"sync"
"time"
)
var pder = &Provider{list: list.New()}
type SessionStore struct {
sid string //session id唯一標(biāo)示
timeAccessed time.Time //最后訪問(wèn)時(shí)間
value map[interface{}]interface{} //session里面存儲(chǔ)的值
}
func (st *SessionStore) Set(key, value interface{}) error {
st.value[key] = value
pder.SessionUpdate(st.sid)
return nil
}
func (st *SessionStore) Get(key interface{}) interface{} {
pder.SessionUpdate(st.sid)
if v, ok := st.value[key]; ok {
return v
} else {
return nil
}
return nil
}
func (st *SessionStore) Delete(key interface{}) error {
delete(st.value, key)
pder.SessionUpdate(st.sid)
return nil
}
func (st *SessionStore) SessionID() string {
return st.sid
}
type Provider struct {
lock sync.Mutex //用來(lái)鎖
sessions map[string]*list.Element //用來(lái)存儲(chǔ)在內(nèi)存
list *list.List //用來(lái)做gc
}
func (pder *Provider) SessionInit(sid string) (session.Session, error) {
pder.lock.Lock()
defer pder.lock.Unlock()
v := make(map[interface{}]interface{}, 0)
newsess := &SessionStore{sid: sid, timeAccessed: time.Now(), value: v}
element := pder.list.PushBack(newsess)
pder.sessions[sid] = element
return newsess, nil
}
func (pder *Provider) SessionRead(sid string) (session.Session, error) {
if element, ok := pder.sessions[sid]; ok {
return element.Value.(*SessionStore), nil
} else {
sess, err := pder.SessionInit(sid)
return sess, err
}
return nil, nil
}
func (pder *Provider) SessionDestroy(sid string) error {
if element, ok := pder.sessions[sid]; ok {
delete(pder.sessions, sid)
pder.list.Remove(element)
return nil
}
return nil
}
func (pder *Provider) SessionGC(maxlifetime int64) {
pder.lock.Lock()
defer pder.lock.Unlock()
for {
element := pder.list.Back()
if element == nil {
break
}
if (element.Value.(*SessionStore).timeAccessed.Unix() + maxlifetime) < time.Now().Unix() {
pder.list.Remove(element)
delete(pder.sessions, element.Value.(*SessionStore).sid)
} else {
break
}
}
}
func (pder *Provider) SessionUpdate(sid string) error {
pder.lock.Lock()
defer pder.lock.Unlock()
if element, ok := pder.sessions[sid]; ok {
element.Value.(*SessionStore).timeAccessed = time.Now()
pder.list.MoveToFront(element)
return nil
}
return nil
}
func init() {
pder.sessions = make(map[string]*list.Element, 0)
session.Register("memory", pder)
}
上面這個(gè)代碼實(shí)現(xiàn)了一個(gè)內(nèi)存存儲(chǔ)的session機(jī)制。通過(guò)init函數(shù)注冊(cè)到session管理器中。這樣就可以方便的調(diào)用了。我們?nèi)绾蝸?lái)調(diào)用該引擎呢?請(qǐng)看下面的代碼
import (
"github.com/astaxie/session"
_ "github.com/astaxie/session/providers/memory"
)
當(dāng)import的時(shí)候已經(jīng)執(zhí)行了memory函數(shù)里面的init函數(shù),這樣就已經(jīng)注冊(cè)到session管理器中,我們就可以使用了,通過(guò)如下方式就可以初始化一個(gè)session管理器:
var globalSessions *session.Manager
//然后在init函數(shù)中初始化
func init() {
globalSessions, _ = session.NewManager("memory", "gosessionid", 3600)
go globalSessions.GC()
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: