Skip to content

Commit 5b245b8

Browse files
committed
Add key prefix
1 parent a304dd2 commit 5b245b8

File tree

1 file changed

+43
-25
lines changed

1 file changed

+43
-25
lines changed

redis.go

+43-25
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,47 @@ var (
1818
)
1919

2020
// NewRedisStore create an instance of a redis store
21-
func NewRedisStore(opts *Options) session.ManagerStore {
21+
func NewRedisStore(opts *Options, prefix ...string) session.ManagerStore {
2222
if opts == nil {
2323
panic("options cannot be nil")
2424
}
25-
return NewRedisStoreWithCli(redis.NewClient(opts.redisOptions()))
25+
return NewRedisStoreWithCli(
26+
redis.NewClient(opts.redisOptions()),
27+
prefix...,
28+
)
2629
}
2730

2831
// 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{
3134
cli: cli,
3235
}
36+
if len(prefix) > 0 {
37+
store.prefix = prefix[0]
38+
}
39+
return store
3340
}
3441

3542
// 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 {
3744
if opts == nil {
3845
panic("options cannot be nil")
3946
}
40-
return NewRedisClusterStoreWithCli(redis.NewClusterClient(opts.redisClusterOptions()))
47+
return NewRedisClusterStoreWithCli(
48+
redis.NewClusterClient(opts.redisClusterOptions()),
49+
prefix...,
50+
)
4151
}
4252

4353
// 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{
4656
cli: cli,
4757
}
58+
if len(prefix) > 0 {
59+
store.prefix = prefix[0]
60+
}
61+
return store
4862
}
4963

5064
type clienter interface {
@@ -58,11 +72,16 @@ type clienter interface {
5872
}
5973

6074
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
6281
}
6382

6483
func (s *managerStore) getValue(sid string) (string, error) {
65-
cmd := s.cli.Get(sid)
84+
cmd := s.cli.Get(s.getKey(sid))
6685
if err := cmd.Err(); err != nil {
6786
if err == redis.Nil {
6887
return "", nil
@@ -85,19 +104,18 @@ func (s *managerStore) parseValue(value string) (map[string]interface{}, error)
85104
}
86105

87106
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
89108
}
90109

91110
func (s *managerStore) Update(ctx context.Context, sid string, expired int64) (session.Store, error) {
92111
value, err := s.getValue(sid)
93112
if err != nil {
94113
return nil, err
95114
} else if value == "" {
96-
97-
return newStore(ctx, s.cli, sid, expired, nil), nil
115+
return newStore(ctx, s, sid, expired, nil), nil
98116
}
99117

100-
cmd := s.cli.Expire(sid, time.Duration(expired)*time.Second)
118+
cmd := s.cli.Expire(s.getKey(sid), time.Duration(expired)*time.Second)
101119
if err = cmd.Err(); err != nil {
102120
return nil, err
103121
}
@@ -107,7 +125,7 @@ func (s *managerStore) Update(ctx context.Context, sid string, expired int64) (s
107125
return nil, err
108126
}
109127

110-
return newStore(ctx, s.cli, sid, expired, values), nil
128+
return newStore(ctx, s, sid, expired, values), nil
111129
}
112130

113131
func (s *managerStore) Delete(_ context.Context, sid string) error {
@@ -117,12 +135,12 @@ func (s *managerStore) Delete(_ context.Context, sid string) error {
117135
return nil
118136
}
119137

120-
cmd := s.cli.Del(sid)
138+
cmd := s.cli.Del(s.getKey(sid))
121139
return cmd.Err()
122140
}
123141

124142
func (s *managerStore) Check(_ context.Context, sid string) (bool, error) {
125-
cmd := s.cli.Exists(sid)
143+
cmd := s.cli.Exists(s.getKey(sid))
126144
if err := cmd.Err(); err != nil {
127145
return false, err
128146
}
@@ -134,12 +152,12 @@ func (s *managerStore) Refresh(ctx context.Context, oldsid, sid string, expired
134152
if err != nil {
135153
return nil, err
136154
} else if value == "" {
137-
return newStore(ctx, s.cli, sid, expired, nil), nil
155+
return newStore(ctx, s, sid, expired, nil), nil
138156
}
139157

140158
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))
143161
_, err = pipe.Exec()
144162
if err != nil {
145163
return nil, err
@@ -150,20 +168,20 @@ func (s *managerStore) Refresh(ctx context.Context, oldsid, sid string, expired
150168
return nil, err
151169
}
152170

153-
return newStore(ctx, s.cli, sid, expired, values), nil
171+
return newStore(ctx, s, sid, expired, values), nil
154172
}
155173

156174
func (s *managerStore) Close() error {
157175
return s.cli.Close()
158176
}
159177

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 {
161179
if values == nil {
162180
values = make(map[string]interface{})
163181
}
164182

165183
return &store{
166-
cli: cli,
184+
ms: ms,
167185
ctx: ctx,
168186
sid: sid,
169187
expired: expired,
@@ -173,11 +191,11 @@ func newStore(ctx context.Context, cli clienter, sid string, expired int64, valu
173191

174192
type store struct {
175193
sync.RWMutex
194+
ms *managerStore
176195
ctx context.Context
177196
sid string
178197
expired int64
179198
values map[string]interface{}
180-
cli clienter
181199
}
182200

183201
func (s *store) Context() context.Context {
@@ -234,6 +252,6 @@ func (s *store) Save() error {
234252
}
235253
s.RUnlock()
236254

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)
238256
return cmd.Err()
239257
}

0 commit comments

Comments
 (0)