@@ -18,33 +18,47 @@ var (
18
18
)
19
19
20
20
// NewRedisStore create an instance of a redis store
21
- func NewRedisStore (opts * Options ) session.ManagerStore {
21
+ func NewRedisStore (opts * Options , prefix ... string ) session.ManagerStore {
22
22
if opts == nil {
23
23
panic ("options cannot be nil" )
24
24
}
25
- return NewRedisStoreWithCli (redis .NewClient (opts .redisOptions ()))
25
+ return NewRedisStoreWithCli (
26
+ redis .NewClient (opts .redisOptions ()),
27
+ prefix ... ,
28
+ )
26
29
}
27
30
28
31
// NewRedisStoreWithCli create an instance of a redis store
29
- func NewRedisStoreWithCli (cli * redis.Client ) session.ManagerStore {
30
- return & managerStore {
32
+ func NewRedisStoreWithCli (cli * redis.Client , prefix ... string ) session.ManagerStore {
33
+ store := & managerStore {
31
34
cli : cli ,
32
35
}
36
+ if len (prefix ) > 0 {
37
+ store .prefix = prefix [0 ]
38
+ }
39
+ return store
33
40
}
34
41
35
42
// NewRedisClusterStore create an instance of a redis cluster store
36
- func NewRedisClusterStore (opts * ClusterOptions ) session.ManagerStore {
43
+ func NewRedisClusterStore (opts * ClusterOptions , prefix ... string ) session.ManagerStore {
37
44
if opts == nil {
38
45
panic ("options cannot be nil" )
39
46
}
40
- return NewRedisClusterStoreWithCli (redis .NewClusterClient (opts .redisClusterOptions ()))
47
+ return NewRedisClusterStoreWithCli (
48
+ redis .NewClusterClient (opts .redisClusterOptions ()),
49
+ prefix ... ,
50
+ )
41
51
}
42
52
43
53
// NewRedisClusterStoreWithCli create an instance of a redis cluster store
44
- func NewRedisClusterStoreWithCli (cli * redis.ClusterClient ) session.ManagerStore {
45
- return & managerStore {
54
+ func NewRedisClusterStoreWithCli (cli * redis.ClusterClient , prefix ... string ) session.ManagerStore {
55
+ store := & managerStore {
46
56
cli : cli ,
47
57
}
58
+ if len (prefix ) > 0 {
59
+ store .prefix = prefix [0 ]
60
+ }
61
+ return store
48
62
}
49
63
50
64
type clienter interface {
@@ -58,11 +72,16 @@ type clienter interface {
58
72
}
59
73
60
74
type managerStore struct {
61
- cli clienter
75
+ cli clienter
76
+ prefix string
77
+ }
78
+
79
+ func (s * managerStore ) getKey (key string ) string {
80
+ return s .prefix + key
62
81
}
63
82
64
83
func (s * managerStore ) getValue (sid string ) (string , error ) {
65
- cmd := s .cli .Get (sid )
84
+ cmd := s .cli .Get (s . getKey ( sid ) )
66
85
if err := cmd .Err (); err != nil {
67
86
if err == redis .Nil {
68
87
return "" , nil
@@ -85,19 +104,18 @@ func (s *managerStore) parseValue(value string) (map[string]interface{}, error)
85
104
}
86
105
87
106
func (s * managerStore ) Create (ctx context.Context , sid string , expired int64 ) (session.Store , error ) {
88
- return newStore (ctx , s . cli , sid , expired , nil ), nil
107
+ return newStore (ctx , s , sid , expired , nil ), nil
89
108
}
90
109
91
110
func (s * managerStore ) Update (ctx context.Context , sid string , expired int64 ) (session.Store , error ) {
92
111
value , err := s .getValue (sid )
93
112
if err != nil {
94
113
return nil , err
95
114
} else if value == "" {
96
-
97
- return newStore (ctx , s .cli , sid , expired , nil ), nil
115
+ return newStore (ctx , s , sid , expired , nil ), nil
98
116
}
99
117
100
- cmd := s .cli .Expire (sid , time .Duration (expired )* time .Second )
118
+ cmd := s .cli .Expire (s . getKey ( sid ) , time .Duration (expired )* time .Second )
101
119
if err = cmd .Err (); err != nil {
102
120
return nil , err
103
121
}
@@ -107,7 +125,7 @@ func (s *managerStore) Update(ctx context.Context, sid string, expired int64) (s
107
125
return nil , err
108
126
}
109
127
110
- return newStore (ctx , s . cli , sid , expired , values ), nil
128
+ return newStore (ctx , s , sid , expired , values ), nil
111
129
}
112
130
113
131
func (s * managerStore ) Delete (_ context.Context , sid string ) error {
@@ -117,12 +135,12 @@ func (s *managerStore) Delete(_ context.Context, sid string) error {
117
135
return nil
118
136
}
119
137
120
- cmd := s .cli .Del (sid )
138
+ cmd := s .cli .Del (s . getKey ( sid ) )
121
139
return cmd .Err ()
122
140
}
123
141
124
142
func (s * managerStore ) Check (_ context.Context , sid string ) (bool , error ) {
125
- cmd := s .cli .Exists (sid )
143
+ cmd := s .cli .Exists (s . getKey ( sid ) )
126
144
if err := cmd .Err (); err != nil {
127
145
return false , err
128
146
}
@@ -134,12 +152,12 @@ func (s *managerStore) Refresh(ctx context.Context, oldsid, sid string, expired
134
152
if err != nil {
135
153
return nil , err
136
154
} else if value == "" {
137
- return newStore (ctx , s . cli , sid , expired , nil ), nil
155
+ return newStore (ctx , s , sid , expired , nil ), nil
138
156
}
139
157
140
158
pipe := s .cli .TxPipeline ()
141
- pipe .Set (sid , value , time .Duration (expired )* time .Second )
142
- pipe .Del (oldsid )
159
+ pipe .Set (s . getKey ( sid ) , value , time .Duration (expired )* time .Second )
160
+ pipe .Del (s . getKey ( oldsid ) )
143
161
_ , err = pipe .Exec ()
144
162
if err != nil {
145
163
return nil , err
@@ -150,20 +168,20 @@ func (s *managerStore) Refresh(ctx context.Context, oldsid, sid string, expired
150
168
return nil , err
151
169
}
152
170
153
- return newStore (ctx , s . cli , sid , expired , values ), nil
171
+ return newStore (ctx , s , sid , expired , values ), nil
154
172
}
155
173
156
174
func (s * managerStore ) Close () error {
157
175
return s .cli .Close ()
158
176
}
159
177
160
- func newStore (ctx context.Context , cli clienter , sid string , expired int64 , values map [string ]interface {}) * store {
178
+ func newStore (ctx context.Context , ms * managerStore , sid string , expired int64 , values map [string ]interface {}) * store {
161
179
if values == nil {
162
180
values = make (map [string ]interface {})
163
181
}
164
182
165
183
return & store {
166
- cli : cli ,
184
+ ms : ms ,
167
185
ctx : ctx ,
168
186
sid : sid ,
169
187
expired : expired ,
@@ -173,11 +191,11 @@ func newStore(ctx context.Context, cli clienter, sid string, expired int64, valu
173
191
174
192
type store struct {
175
193
sync.RWMutex
194
+ ms * managerStore
176
195
ctx context.Context
177
196
sid string
178
197
expired int64
179
198
values map [string ]interface {}
180
- cli clienter
181
199
}
182
200
183
201
func (s * store ) Context () context.Context {
@@ -234,6 +252,6 @@ func (s *store) Save() error {
234
252
}
235
253
s .RUnlock ()
236
254
237
- cmd := s .cli .Set (s .sid , value , time .Duration (s .expired )* time .Second )
255
+ cmd := s .ms . cli .Set (s .ms . getKey ( s . sid ) , value , time .Duration (s .expired )* time .Second )
238
256
return cmd .Err ()
239
257
}
0 commit comments