This repository has been archived by the owner on Jul 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
redis_session.go
133 lines (101 loc) · 1.95 KB
/
redis_session.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package session
import (
"encoding/json"
"sync"
"github.com/garyburd/redigo/redis"
)
const (
SessionFlagNone = iota
SessionFlagModify
SessionFlagLoad
)
type RedisSession struct {
id string
pool *redis.Pool
data map[string]interface{}
rwlock sync.RWMutex
flag int
}
func NewRedisSession(id string, pool *redis.Pool) *RedisSession {
s := &RedisSession{
id: id,
data: make(map[string]interface{}, 8),
flag: SessionFlagNone,
pool: pool,
}
return s
}
func (r *RedisSession) Set(key string, value interface{}) error {
r.rwlock.Lock()
defer r.rwlock.Unlock()
r.data[key] = value
r.flag = SessionFlagModify
return nil
}
func (r *RedisSession) loadFromRedis() (err error) {
conn := r.pool.Get()
reply, err := conn.Do("GET", r.id)
if err != nil {
return
}
data, err := redis.String(reply, err)
if err != nil {
return
}
err = json.Unmarshal([]byte(data), &r.data)
if err != nil {
return
}
return
}
func (r *RedisSession) Get(key string) (result interface{}, err error) {
r.rwlock.RLock()
defer r.rwlock.RUnlock()
//实现了一个延迟加载的功能
if r.flag == SessionFlagNone {
//该session还没有加载,那么就从redis中加载数据
err = r.loadFromRedis()
if err != nil {
return
}
}
result, ok := r.data[key]
if !ok {
err = ErrKeyNotExistInSession
return
}
return
}
func (m *RedisSession) Id() string {
return m.id
}
func (r *RedisSession) Del(key string) error {
r.rwlock.Lock()
defer r.rwlock.Unlock()
r.flag = SessionFlagModify
delete(r.data, key)
return nil
}
func (r *RedisSession) Save() (err error) {
r.rwlock.Lock()
defer r.rwlock.Unlock()
if r.flag != SessionFlagModify {
return
}
data, err := json.Marshal(r.data)
if err != nil {
return
}
conn := r.pool.Get()
_, err = conn.Do("SET", r.id, string(data))
if err != nil {
return
}
return
}
func (m *RedisSession) IsModify() bool {
if m.flag == SessionFlagModify {
return true
}
return false
}