From 682544165fdd5fc849c8d1c9f6b7c11975cc59d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=82=85=E5=B0=8F=E9=BB=91?= Date: Wed, 29 Jan 2014 18:15:09 +0800 Subject: [PATCH] add comments for session packages, part 2 --- session/sess_mem.go | 22 +++++++++++++++++++--- session/sess_mysql.go | 32 ++++++++++++++++++++++++++------ session/sess_redis.go | 21 ++++++++++++++++++--- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/session/sess_mem.go b/session/sess_mem.go index c74c2602..33c84717 100644 --- a/session/sess_mem.go +++ b/session/sess_mem.go @@ -9,6 +9,8 @@ import ( var mempder = &MemProvider{list: list.New(), sessions: make(map[string]*list.Element)} +// memory session store. +// it saved sessions in a map in memory. type MemSessionStore struct { sid string //session id timeAccessed time.Time //last access time @@ -16,6 +18,7 @@ type MemSessionStore struct { lock sync.RWMutex } +// set value to memory session func (st *MemSessionStore) Set(key, value interface{}) error { st.lock.Lock() defer st.lock.Unlock() @@ -23,6 +26,7 @@ func (st *MemSessionStore) Set(key, value interface{}) error { return nil } +// get value from memory session by key func (st *MemSessionStore) Get(key interface{}) interface{} { st.lock.RLock() defer st.lock.RUnlock() @@ -34,6 +38,7 @@ func (st *MemSessionStore) Get(key interface{}) interface{} { return nil } +// delete in memory session by key func (st *MemSessionStore) Delete(key interface{}) error { st.lock.Lock() defer st.lock.Unlock() @@ -41,6 +46,7 @@ func (st *MemSessionStore) Delete(key interface{}) error { return nil } +// clear all values in memory session func (st *MemSessionStore) Flush() error { st.lock.Lock() defer st.lock.Unlock() @@ -48,27 +54,31 @@ func (st *MemSessionStore) Flush() error { return nil } +// get this id of memory session store func (st *MemSessionStore) SessionID() string { return st.sid } +// Implement method, no used. func (st *MemSessionStore) SessionRelease(w http.ResponseWriter) { } type MemProvider struct { - lock sync.RWMutex //用来锁 - sessions map[string]*list.Element //用来存储在内存 - list *list.List //用来做gc + lock sync.RWMutex // locker + sessions map[string]*list.Element // map in memory + list *list.List // for gc maxlifetime int64 savePath string } +// init memory session func (pder *MemProvider) SessionInit(maxlifetime int64, savePath string) error { pder.maxlifetime = maxlifetime pder.savePath = savePath return nil } +// get memory session store by sid func (pder *MemProvider) SessionRead(sid string) (SessionStore, error) { pder.lock.RLock() if element, ok := pder.sessions[sid]; ok { @@ -87,6 +97,7 @@ func (pder *MemProvider) SessionRead(sid string) (SessionStore, error) { return nil, nil } +// check session store exist in memory session by sid func (pder *MemProvider) SessionExist(sid string) bool { pder.lock.RLock() defer pder.lock.RUnlock() @@ -97,6 +108,7 @@ func (pder *MemProvider) SessionExist(sid string) bool { } } +// generate new sid for session store in memory session func (pder *MemProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { pder.lock.RLock() if element, ok := pder.sessions[oldsid]; ok { @@ -120,6 +132,7 @@ func (pder *MemProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er return nil, nil } +// delete session store in memory session by id func (pder *MemProvider) SessionDestroy(sid string) error { pder.lock.Lock() defer pder.lock.Unlock() @@ -131,6 +144,7 @@ func (pder *MemProvider) SessionDestroy(sid string) error { return nil } +// clean expired session stores in memory session func (pder *MemProvider) SessionGC() { pder.lock.RLock() for { @@ -152,10 +166,12 @@ func (pder *MemProvider) SessionGC() { pder.lock.RUnlock() } +// get count number of memory session func (pder *MemProvider) SessionAll() int { return pder.list.Len() } +// expand time of session store by id in memory session func (pder *MemProvider) SessionUpdate(sid string) error { pder.lock.Lock() defer pder.lock.Unlock() diff --git a/session/sess_mysql.go b/session/sess_mysql.go index 7bad9e4a..b471c6c0 100644 --- a/session/sess_mysql.go +++ b/session/sess_mysql.go @@ -1,11 +1,12 @@ package session -//CREATE TABLE `session` ( -// `session_key` char(64) NOT NULL, -// `session_data` blob, -// `session_expiry` int(11) unsigned NOT NULL, -// PRIMARY KEY (`session_key`) -//) ENGINE=MyISAM DEFAULT CHARSET=utf8; +// mysql session support need create table as sql: +// CREATE TABLE `session` ( +// `session_key` char(64) NOT NULL, +// session_data` blob, +// `session_expiry` int(11) unsigned NOT NULL, +// PRIMARY KEY (`session_key`) +// ) ENGINE=MyISAM DEFAULT CHARSET=utf8; import ( "database/sql" @@ -18,6 +19,7 @@ import ( var mysqlpder = &MysqlProvider{} +// mysql session store type MysqlSessionStore struct { c *sql.DB sid string @@ -25,6 +27,8 @@ type MysqlSessionStore struct { values map[interface{}]interface{} } +// set value in mysql session. +// it is temp value in map. func (st *MysqlSessionStore) Set(key, value interface{}) error { st.lock.Lock() defer st.lock.Unlock() @@ -32,6 +36,7 @@ func (st *MysqlSessionStore) Set(key, value interface{}) error { return nil } +// get value from mysql session func (st *MysqlSessionStore) Get(key interface{}) interface{} { st.lock.RLock() defer st.lock.RUnlock() @@ -43,6 +48,7 @@ func (st *MysqlSessionStore) Get(key interface{}) interface{} { return nil } +// delete value in mysql session func (st *MysqlSessionStore) Delete(key interface{}) error { st.lock.Lock() defer st.lock.Unlock() @@ -50,6 +56,7 @@ func (st *MysqlSessionStore) Delete(key interface{}) error { return nil } +// clear all values in mysql session func (st *MysqlSessionStore) Flush() error { st.lock.Lock() defer st.lock.Unlock() @@ -57,10 +64,13 @@ func (st *MysqlSessionStore) Flush() error { return nil } +// get session id of this mysql session store func (st *MysqlSessionStore) SessionID() string { return st.sid } +// save mysql session values to database. +// must call this method to save values to database. func (st *MysqlSessionStore) SessionRelease(w http.ResponseWriter) { defer st.c.Close() b, err := encodeGob(st.values) @@ -72,11 +82,13 @@ func (st *MysqlSessionStore) SessionRelease(w http.ResponseWriter) { } +// mysql session provider type MysqlProvider struct { maxlifetime int64 savePath string } +// connect to mysql func (mp *MysqlProvider) connectInit() *sql.DB { db, e := sql.Open("mysql", mp.savePath) if e != nil { @@ -85,12 +97,15 @@ func (mp *MysqlProvider) connectInit() *sql.DB { return db } +// init mysql session. +// savepath is the connection string of mysql. func (mp *MysqlProvider) SessionInit(maxlifetime int64, savePath string) error { mp.maxlifetime = maxlifetime mp.savePath = savePath return nil } +// get mysql session by sid func (mp *MysqlProvider) SessionRead(sid string) (SessionStore, error) { c := mp.connectInit() row := c.QueryRow("select session_data from session where session_key=?", sid) @@ -113,6 +128,7 @@ func (mp *MysqlProvider) SessionRead(sid string) (SessionStore, error) { return rs, nil } +// check mysql session exist func (mp *MysqlProvider) SessionExist(sid string) bool { c := mp.connectInit() defer c.Close() @@ -126,6 +142,7 @@ func (mp *MysqlProvider) SessionExist(sid string) bool { } } +// generate new sid for mysql session func (mp *MysqlProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { c := mp.connectInit() row := c.QueryRow("select session_data from session where session_key=?", oldsid) @@ -148,6 +165,7 @@ func (mp *MysqlProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er return rs, nil } +// delete mysql session by sid func (mp *MysqlProvider) SessionDestroy(sid string) error { c := mp.connectInit() c.Exec("DELETE FROM session where session_key=?", sid) @@ -155,6 +173,7 @@ func (mp *MysqlProvider) SessionDestroy(sid string) error { return nil } +// delete expired values in mysql session func (mp *MysqlProvider) SessionGC() { c := mp.connectInit() c.Exec("DELETE from session where session_expiry < ?", time.Now().Unix()-mp.maxlifetime) @@ -162,6 +181,7 @@ func (mp *MysqlProvider) SessionGC() { return } +// count values in mysql session func (mp *MysqlProvider) SessionAll() int { c := mp.connectInit() defer c.Close() diff --git a/session/sess_redis.go b/session/sess_redis.go index b05e4831..3c51b793 100644 --- a/session/sess_redis.go +++ b/session/sess_redis.go @@ -11,10 +11,12 @@ import ( var redispder = &RedisProvider{} +// redis max pool size var MAX_POOL_SIZE = 100 var redisPool chan redis.Conn +// redis session store type RedisSessionStore struct { p *redis.Pool sid string @@ -23,6 +25,7 @@ type RedisSessionStore struct { maxlifetime int64 } +// set value in redis session func (rs *RedisSessionStore) Set(key, value interface{}) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -30,6 +33,7 @@ func (rs *RedisSessionStore) Set(key, value interface{}) error { return nil } +// get value in redis session func (rs *RedisSessionStore) Get(key interface{}) interface{} { rs.lock.RLock() defer rs.lock.RUnlock() @@ -41,6 +45,7 @@ func (rs *RedisSessionStore) Get(key interface{}) interface{} { return nil } +// delete value in redis session func (rs *RedisSessionStore) Delete(key interface{}) error { rs.lock.Lock() defer rs.lock.Unlock() @@ -48,6 +53,7 @@ func (rs *RedisSessionStore) Delete(key interface{}) error { return nil } +// clear all values in redis session func (rs *RedisSessionStore) Flush() error { rs.lock.Lock() defer rs.lock.Unlock() @@ -55,10 +61,12 @@ func (rs *RedisSessionStore) Flush() error { return nil } +// get redis session id func (rs *RedisSessionStore) SessionID() string { return rs.sid } +// save session values to redis func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { c := rs.p.Get() defer c.Close() @@ -77,6 +85,7 @@ func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { c.Do("SET", rs.sid, string(b), "EX", rs.maxlifetime) } +// redis session provider type RedisProvider struct { maxlifetime int64 savePath string @@ -85,8 +94,9 @@ type RedisProvider struct { poollist *redis.Pool } -//savepath like redisserveraddr,poolsize,password -//127.0.0.1:6379,100,astaxie +// init redis session +// savepath like redis server addr,pool size,password +// e.g. 127.0.0.1:6379,100,astaxie func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { rp.maxlifetime = maxlifetime configs := strings.Split(savePath, ",") @@ -122,6 +132,7 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { return nil } +// read redis session by sid func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { c := rp.poollist.Get() defer c.Close() @@ -141,6 +152,7 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { return rs, nil } +// check redis session exist by sid func (rp *RedisProvider) SessionExist(sid string) bool { c := rp.poollist.Get() defer c.Close() @@ -152,6 +164,7 @@ func (rp *RedisProvider) SessionExist(sid string) bool { } } +// generate new sid for redis session func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { c := rp.poollist.Get() defer c.Close() @@ -181,6 +194,7 @@ func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er return rs, nil } +// delete redis session by id func (rp *RedisProvider) SessionDestroy(sid string) error { c := rp.poollist.Get() defer c.Close() @@ -189,11 +203,12 @@ func (rp *RedisProvider) SessionDestroy(sid string) error { return nil } +// Impelment method, no used. func (rp *RedisProvider) SessionGC() { return } -//@todo +// @todo func (rp *RedisProvider) SessionAll() int { return 0 }