Skip to content

Commit d596831

Browse files
authored
Merge pull request #1052 from gofiber/redis-keys
Add support for Keys() to Redis Driver
2 parents 7638e00 + 50bea20 commit d596831

File tree

4 files changed

+130
-11
lines changed

4 files changed

+130
-11
lines changed

.github/workflows/test-redis.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ jobs:
6666
slave3-port: 7005
6767
sleep-duration: 10
6868

69+
- name: Wait for Redis to Start
70+
run: sleep 15
71+
6972
- name: Install Go
7073
uses: actions/setup-go@v4
7174
with:

redis/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func (s *Storage) Delete(key string) error
2929
func (s *Storage) Reset() error
3030
func (s *Storage) Close() error
3131
func (s *Storage) Conn() redis.UniversalClient
32+
func (s *Storage) Keys() ([][]byte, error)
3233
```
3334
### Installation
3435
Redis is tested on the 2 last [Go versions](https://golang.org/dl/) with support for modules. So make sure to initialize one first if you didn't do that yet:

redis/redis.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ func New(config ...Config) *Storage {
7474
}
7575
}
7676

77-
// ...
78-
7977
// Get value by key
8078
func (s *Storage) Get(key string) ([]byte, error) {
8179
if len(key) <= 0 {
@@ -118,3 +116,32 @@ func (s *Storage) Close() error {
118116
func (s *Storage) Conn() redis.UniversalClient {
119117
return s.db
120118
}
119+
120+
// Return all the keys
121+
func (s *Storage) Keys() ([][]byte, error) {
122+
var keys [][]byte
123+
var cursor uint64
124+
var err error
125+
126+
for {
127+
var batch []string
128+
129+
if batch, cursor, err = s.db.Scan(context.Background(), cursor, "*", 10).Result(); err != nil {
130+
return nil, err
131+
}
132+
133+
for _, key := range batch {
134+
keys = append(keys, []byte(key))
135+
}
136+
137+
if cursor == 0 {
138+
break
139+
}
140+
}
141+
142+
if len(keys) == 0 {
143+
return nil, nil
144+
}
145+
146+
return keys, nil
147+
}

redis/redis_test.go

Lines changed: 97 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@ import (
99
"github.com/stretchr/testify/require"
1010
)
1111

12-
var testStore = New(Config{
13-
Reset: true,
14-
})
15-
1612
func Test_Redis_Set(t *testing.T) {
1713
var (
14+
testStore = New(Config{
15+
Reset: true,
16+
})
1817
key = "john"
1918
val = []byte("doe")
2019
)
@@ -25,6 +24,9 @@ func Test_Redis_Set(t *testing.T) {
2524

2625
func Test_Redis_Set_Override(t *testing.T) {
2726
var (
27+
testStore = New(Config{
28+
Reset: true,
29+
})
2830
key = "john"
2931
val = []byte("doe")
3032
)
@@ -34,10 +36,17 @@ func Test_Redis_Set_Override(t *testing.T) {
3436

3537
err = testStore.Set(key, val, 0)
3638
require.NoError(t, err)
39+
40+
keys, err := testStore.Keys()
41+
require.NoError(t, err)
42+
require.Len(t, keys, 1)
3743
}
3844

3945
func Test_Redis_Get(t *testing.T) {
4046
var (
47+
testStore = New(Config{
48+
Reset: true,
49+
})
4150
key = "john"
4251
val = []byte("doe")
4352
)
@@ -48,10 +57,17 @@ func Test_Redis_Get(t *testing.T) {
4857
result, err := testStore.Get(key)
4958
require.NoError(t, err)
5059
require.Equal(t, val, result)
60+
61+
keys, err := testStore.Keys()
62+
require.NoError(t, err)
63+
require.Len(t, keys, 1)
5164
}
5265

53-
func Test_Redis_Set_Expiration(t *testing.T) {
66+
func Test_Redis_Expiration(t *testing.T) {
5467
var (
68+
testStore = New(Config{
69+
Reset: true,
70+
})
5571
key = "john"
5672
val = []byte("doe")
5773
exp = 1 * time.Second
@@ -61,24 +77,30 @@ func Test_Redis_Set_Expiration(t *testing.T) {
6177
require.NoError(t, err)
6278

6379
time.Sleep(1100 * time.Millisecond)
64-
}
65-
66-
func Test_Redis_Get_Expired(t *testing.T) {
67-
key := "john"
6880

6981
result, err := testStore.Get(key)
7082
require.NoError(t, err)
7183
require.Zero(t, len(result))
84+
85+
keys, err := testStore.Keys()
86+
require.NoError(t, err)
87+
require.Nil(t, keys)
7288
}
7389

7490
func Test_Redis_Get_NotExist(t *testing.T) {
91+
testStore := New(Config{
92+
Reset: true,
93+
})
7594
result, err := testStore.Get("notexist")
7695
require.NoError(t, err)
7796
require.Zero(t, len(result))
7897
}
7998

8099
func Test_Redis_Delete(t *testing.T) {
81100
var (
101+
testStore = New(Config{
102+
Reset: true,
103+
})
82104
key = "john"
83105
val = []byte("doe")
84106
)
@@ -92,9 +114,16 @@ func Test_Redis_Delete(t *testing.T) {
92114
result, err := testStore.Get(key)
93115
require.NoError(t, err)
94116
require.Zero(t, len(result))
117+
118+
keys, err := testStore.Keys()
119+
require.NoError(t, err)
120+
require.Nil(t, keys)
95121
}
96122

97123
func Test_Redis_Reset(t *testing.T) {
124+
testStore := New(Config{
125+
Reset: true,
126+
})
98127
val := []byte("doe")
99128

100129
err := testStore.Set("john1", val, 0)
@@ -103,6 +132,10 @@ func Test_Redis_Reset(t *testing.T) {
103132
err = testStore.Set("john2", val, 0)
104133
require.NoError(t, err)
105134

135+
keys, err := testStore.Keys()
136+
require.NoError(t, err)
137+
require.Len(t, keys, 2)
138+
106139
err = testStore.Reset()
107140
require.NoError(t, err)
108141

@@ -113,13 +146,23 @@ func Test_Redis_Reset(t *testing.T) {
113146
result, err = testStore.Get("john2")
114147
require.NoError(t, err)
115148
require.Zero(t, len(result))
149+
150+
keys, err = testStore.Keys()
151+
require.NoError(t, err)
152+
require.Nil(t, keys)
116153
}
117154

118155
func Test_Redis_Close(t *testing.T) {
156+
testStore := New(Config{
157+
Reset: true,
158+
})
119159
require.Nil(t, testStore.Close())
120160
}
121161

122162
func Test_Redis_Conn(t *testing.T) {
163+
testStore := New(Config{
164+
Reset: true,
165+
})
123166
require.True(t, testStore.Conn() != nil)
124167
}
125168

@@ -184,6 +227,10 @@ func Test_Redis_Initalize_WithURL_TLS(t *testing.T) {
184227
err = testStoreUrl.Delete(key)
185228
require.NoError(t, err)
186229

230+
keys, err := testStoreUrl.Keys()
231+
require.NoError(t, err)
232+
require.Nil(t, keys)
233+
187234
require.Nil(t, testStoreUrl.Close())
188235
}
189236

@@ -226,6 +273,10 @@ func Test_Redis_Initalize_WithURL_TLS_Verify(t *testing.T) {
226273
err = testStoreUrl.Delete(key)
227274
require.NoError(t, err)
228275

276+
keys, err := testStoreUrl.Keys()
277+
require.NoError(t, err)
278+
require.Nil(t, keys)
279+
229280
require.Nil(t, testStoreUrl.Close())
230281
}
231282

@@ -249,6 +300,10 @@ func Test_Redis_Initalize_With_Secure_URL(t *testing.T) {
249300
err = testStoreUrl.Delete(key)
250301
require.NoError(t, err)
251302

303+
keys, err := testStoreUrl.Keys()
304+
require.NoError(t, err)
305+
require.Nil(t, keys)
306+
252307
require.Nil(t, testStoreUrl.Close())
253308
}
254309

@@ -273,6 +328,10 @@ func Test_Redis_Universal_Addrs(t *testing.T) {
273328
err = testStoreUniversal.Delete(key)
274329
require.NoError(t, err)
275330

331+
keys, err := testStoreUniversal.Keys()
332+
require.NoError(t, err)
333+
require.Nil(t, keys)
334+
276335
require.Nil(t, testStoreUniversal.Close())
277336
}
278337

@@ -299,6 +358,10 @@ func Test_Redis_Universal_With_URL_Undefined(t *testing.T) {
299358
err = testStoreUniversal.Delete(key)
300359
require.NoError(t, err)
301360

361+
keys, err := testStoreUniversal.Keys()
362+
require.NoError(t, err)
363+
require.Nil(t, keys)
364+
302365
require.Nil(t, testStoreUniversal.Close())
303366
}
304367

@@ -325,6 +388,10 @@ func Test_Redis_Universal_With_URL_Defined(t *testing.T) {
325388
err = testStoreUniversal.Delete(key)
326389
require.NoError(t, err)
327390

391+
keys, err := testStoreUniversal.Keys()
392+
require.NoError(t, err)
393+
require.Nil(t, keys)
394+
328395
require.Nil(t, testStoreUniversal.Close())
329396
}
330397

@@ -352,6 +419,10 @@ func Test_Redis_Universal_With_HostPort(t *testing.T) {
352419
err = testStoreUniversal.Delete(key)
353420
require.NoError(t, err)
354421

422+
keys, err := testStoreUniversal.Keys()
423+
require.NoError(t, err)
424+
require.Nil(t, keys)
425+
355426
require.Nil(t, testStoreUniversal.Close())
356427
}
357428

@@ -380,6 +451,10 @@ func Test_Redis_Universal_With_HostPort_And_URL(t *testing.T) {
380451
err = testStoreUniversal.Delete(key)
381452
require.NoError(t, err)
382453

454+
keys, err := testStoreUniversal.Keys()
455+
require.NoError(t, err)
456+
require.Nil(t, keys)
457+
383458
require.Nil(t, testStoreUniversal.Close())
384459
}
385460

@@ -410,10 +485,17 @@ func Test_Redis_Cluster(t *testing.T) {
410485
err = testStoreUniversal.Delete(key)
411486
require.NoError(t, err)
412487

488+
keys, err := testStoreUniversal.Keys()
489+
require.NoError(t, err)
490+
require.Nil(t, keys)
491+
413492
require.Nil(t, testStoreUniversal.Close())
414493
}
415494

416495
func Benchmark_Redis_Set(b *testing.B) {
496+
testStore := New(Config{
497+
Reset: true,
498+
})
417499
b.ReportAllocs()
418500
b.ResetTimer()
419501

@@ -426,6 +508,9 @@ func Benchmark_Redis_Set(b *testing.B) {
426508
}
427509

428510
func Benchmark_Redis_Get(b *testing.B) {
511+
testStore := New(Config{
512+
Reset: true,
513+
})
429514
err := testStore.Set("john", []byte("doe"), 0)
430515
require.NoError(b, err)
431516

@@ -440,6 +525,9 @@ func Benchmark_Redis_Get(b *testing.B) {
440525
}
441526

442527
func Benchmark_Redis_SetAndDelete(b *testing.B) {
528+
testStore := New(Config{
529+
Reset: true,
530+
})
443531
b.ReportAllocs()
444532
b.ResetTimer()
445533

0 commit comments

Comments
 (0)