Skip to content

Commit af841e9

Browse files
committed
Format and remove 06.3.md spaces
1 parent 22902f6 commit af841e9

File tree

1 file changed

+106
-106
lines changed

1 file changed

+106
-106
lines changed

zh/06.3.md

+106-106
Original file line numberDiff line numberDiff line change
@@ -2,136 +2,136 @@
22
上一节我们介绍了Session管理器的实现原理,定义了存储session的接口,这小节我们将示例一个基于内存的session存储接口的实现,其他的存储方式,读者可以自行参考示例来实现,内存的实现请看下面的例子代码
33
```Go
44

5-
package memory
6-
7-
import (
8-
"container/list"
9-
"github.com/astaxie/session"
10-
"sync"
11-
"time"
12-
)
13-
14-
var pder = &Provider{list: list.New()}
15-
16-
type SessionStore struct {
17-
sid string //session id唯一标示
18-
timeAccessed time.Time //最后访问时间
19-
value map[interface{}]interface{} //session里面存储的值
20-
}
21-
22-
func (st *SessionStore) Set(key, value interface{}) error {
23-
st.value[key] = value
24-
pder.SessionUpdate(st.sid)
5+
package memory
6+
7+
import (
8+
"container/list"
9+
"github.com/astaxie/session"
10+
"sync"
11+
"time"
12+
)
13+
14+
var pder = &Provider{list: list.New()}
15+
16+
type SessionStore struct {
17+
sid string //session id唯一标示
18+
timeAccessed time.Time //最后访问时间
19+
value map[interface{}]interface{} //session里面存储的值
20+
}
21+
22+
func (st *SessionStore) Set(key, value interface{}) error {
23+
st.value[key] = value
24+
pder.SessionUpdate(st.sid)
25+
return nil
26+
}
27+
28+
func (st *SessionStore) Get(key interface{}) interface{} {
29+
pder.SessionUpdate(st.sid)
30+
if v, ok := st.value[key]; ok {
31+
return v
32+
} else {
2533
return nil
2634
}
27-
28-
func (st *SessionStore) Get(key interface{}) interface{} {
29-
pder.SessionUpdate(st.sid)
30-
if v, ok := st.value[key]; ok {
31-
return v
32-
} else {
33-
return nil
34-
}
35-
return nil
35+
return nil
36+
}
37+
38+
func (st *SessionStore) Delete(key interface{}) error {
39+
delete(st.value, key)
40+
pder.SessionUpdate(st.sid)
41+
return nil
42+
}
43+
44+
func (st *SessionStore) SessionID() string {
45+
return st.sid
46+
}
47+
48+
type Provider struct {
49+
lock sync.Mutex //用来锁
50+
sessions map[string]*list.Element //用来存储在内存
51+
list *list.List //用来做gc
52+
}
53+
54+
func (pder *Provider) SessionInit(sid string) (session.Session, error) {
55+
pder.lock.Lock()
56+
defer pder.lock.Unlock()
57+
v := make(map[interface{}]interface{}, 0)
58+
newsess := &SessionStore{sid: sid, timeAccessed: time.Now(), value: v}
59+
element := pder.list.PushBack(newsess)
60+
pder.sessions[sid] = element
61+
return newsess, nil
62+
}
63+
64+
func (pder *Provider) SessionRead(sid string) (session.Session, error) {
65+
if element, ok := pder.sessions[sid]; ok {
66+
return element.Value.(*SessionStore), nil
67+
} else {
68+
sess, err := pder.SessionInit(sid)
69+
return sess, err
3670
}
71+
return nil, nil
72+
}
3773

38-
func (st *SessionStore) Delete(key interface{}) error {
39-
delete(st.value, key)
40-
pder.SessionUpdate(st.sid)
74+
func (pder *Provider) SessionDestroy(sid string) error {
75+
if element, ok := pder.sessions[sid]; ok {
76+
delete(pder.sessions, sid)
77+
pder.list.Remove(element)
4178
return nil
4279
}
80+
return nil
81+
}
4382

44-
func (st *SessionStore) SessionID() string {
45-
return st.sid
46-
}
47-
48-
type Provider struct {
49-
lock sync.Mutex //用来锁
50-
sessions map[string]*list.Element //用来存储在内存
51-
list *list.List //用来做gc
52-
}
53-
54-
func (pder *Provider) SessionInit(sid string) (session.Session, error) {
55-
pder.lock.Lock()
56-
defer pder.lock.Unlock()
57-
v := make(map[interface{}]interface{}, 0)
58-
newsess := &SessionStore{sid: sid, timeAccessed: time.Now(), value: v}
59-
element := pder.list.PushBack(newsess)
60-
pder.sessions[sid] = element
61-
return newsess, nil
62-
}
83+
func (pder *Provider) SessionGC(maxlifetime int64) {
84+
pder.lock.Lock()
85+
defer pder.lock.Unlock()
6386

64-
func (pder *Provider) SessionRead(sid string) (session.Session, error) {
65-
if element, ok := pder.sessions[sid]; ok {
66-
return element.Value.(*SessionStore), nil
67-
} else {
68-
sess, err := pder.SessionInit(sid)
69-
return sess, err
87+
for {
88+
element := pder.list.Back()
89+
if element == nil {
90+
break
7091
}
71-
return nil, nil
72-
}
73-
74-
func (pder *Provider) SessionDestroy(sid string) error {
75-
if element, ok := pder.sessions[sid]; ok {
76-
delete(pder.sessions, sid)
92+
if (element.Value.(*SessionStore).timeAccessed.Unix() + maxlifetime) < time.Now().Unix() {
7793
pder.list.Remove(element)
78-
return nil
79-
}
80-
return nil
81-
}
82-
83-
func (pder *Provider) SessionGC(maxlifetime int64) {
84-
pder.lock.Lock()
85-
defer pder.lock.Unlock()
86-
87-
for {
88-
element := pder.list.Back()
89-
if element == nil {
90-
break
91-
}
92-
if (element.Value.(*SessionStore).timeAccessed.Unix() + maxlifetime) < time.Now().Unix() {
93-
pder.list.Remove(element)
94-
delete(pder.sessions, element.Value.(*SessionStore).sid)
95-
} else {
96-
break
97-
}
94+
delete(pder.sessions, element.Value.(*SessionStore).sid)
95+
} else {
96+
break
9897
}
9998
}
100-
101-
func (pder *Provider) SessionUpdate(sid string) error {
102-
pder.lock.Lock()
103-
defer pder.lock.Unlock()
104-
if element, ok := pder.sessions[sid]; ok {
105-
element.Value.(*SessionStore).timeAccessed = time.Now()
106-
pder.list.MoveToFront(element)
107-
return nil
108-
}
99+
}
100+
101+
func (pder *Provider) SessionUpdate(sid string) error {
102+
pder.lock.Lock()
103+
defer pder.lock.Unlock()
104+
if element, ok := pder.sessions[sid]; ok {
105+
element.Value.(*SessionStore).timeAccessed = time.Now()
106+
pder.list.MoveToFront(element)
109107
return nil
110108
}
109+
return nil
110+
}
111111

112-
func init() {
113-
pder.sessions = make(map[string]*list.Element, 0)
114-
session.Register("memory", pder)
115-
}
112+
func init() {
113+
pder.sessions = make(map[string]*list.Element, 0)
114+
session.Register("memory", pder)
115+
}
116116
```
117117
上面这个代码实现了一个内存存储的session机制。通过init函数注册到session管理器中。这样就可以方便的调用了。我们如何来调用该引擎呢?请看下面的代码
118118
```Go
119119

120-
import (
121-
"github.com/astaxie/session"
122-
_ "github.com/astaxie/session/providers/memory"
123-
)
120+
import (
121+
"github.com/astaxie/session"
122+
_ "github.com/astaxie/session/providers/memory"
123+
)
124124
```
125125
当import的时候已经执行了memory函数里面的init函数,这样就已经注册到session管理器中,我们就可以使用了,通过如下方式就可以初始化一个session管理器:
126126
```Go
127127

128-
var globalSessions *session.Manager
128+
var globalSessions *session.Manager
129129

130-
//然后在init函数中初始化
131-
func init() {
132-
globalSessions, _ = session.NewManager("memory", "gosessionid", 3600)
133-
go globalSessions.GC()
134-
}
130+
//然后在init函数中初始化
131+
func init() {
132+
globalSessions, _ = session.NewManager("memory", "gosessionid", 3600)
133+
go globalSessions.GC()
134+
}
135135

136136
```
137137
## links

0 commit comments

Comments
 (0)