Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
张磊
/
FileStorageBeego
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
68254416
authored
2014-01-29 18:15:09 +0800
by
傅小黑
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
add comments for session packages, part 2
1 parent
3f0ec5c0
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
60 additions
and
9 deletions
session/sess_mem.go
session/sess_mysql.go
session/sess_redis.go
session/sess_mem.go
View file @
6825441
...
...
@@ -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
()
...
...
session/sess_mysql.go
View file @
6825441
package
session
//CREATE TABLE `session` (
// mysql session support need create table as sql:
// CREATE TABLE `session` (
// `session_key` char(64) NOT NULL,
//
`
session_data` blob,
//
session_data` blob,
// `session_expiry` int(11) unsigned NOT NULL,
// PRIMARY KEY (`session_key`)
//) ENGINE=MyISAM DEFAULT CHARSET=utf8;
//
) 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
()
...
...
session/sess_redis.go
View file @
6825441
...
...
@@ -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
}
...
...
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment