diff --git a/redis/README.md b/redis/README.md index f546d21b..aae925bc 100644 --- a/redis/README.md +++ b/redis/README.md @@ -29,6 +29,7 @@ func (s *Storage) Delete(key string) error func (s *Storage) Reset() error func (s *Storage) Close() error func (s *Storage) Conn() redis.UniversalClient +func (s *Storage) Keys() ([][]byte, error) ``` ### Installation 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: diff --git a/redis/redis.go b/redis/redis.go index c61f37c7..576a417e 100644 --- a/redis/redis.go +++ b/redis/redis.go @@ -74,8 +74,6 @@ func New(config ...Config) *Storage { } } -// ... - // Get value by key func (s *Storage) Get(key string) ([]byte, error) { if len(key) <= 0 { @@ -118,3 +116,32 @@ func (s *Storage) Close() error { func (s *Storage) Conn() redis.UniversalClient { return s.db } + +// Return all the keys +func (s *Storage) Keys() ([][]byte, error) { + var keys [][]byte + var cursor uint64 + + for { + var batch []string + var err error + batch, cursor, err = s.db.Scan(context.Background(), cursor, "*", 10).Result() + if err != nil { + return nil, err + } + + for _, key := range batch { + keys = append(keys, []byte(key)) + } + + if cursor == 0 { + break + } + } + + if len(keys) == 0 { + return nil, nil + } + + return keys, nil +} diff --git a/redis/redis_test.go b/redis/redis_test.go index 42aca367..13b11abe 100644 --- a/redis/redis_test.go +++ b/redis/redis_test.go @@ -34,6 +34,10 @@ func Test_Redis_Set_Override(t *testing.T) { err = testStore.Set(key, val, 0) require.NoError(t, err) + + keys, err := testStore.Keys() + require.NoError(t, err) + require.Len(t, keys, 1) } func Test_Redis_Get(t *testing.T) { @@ -48,9 +52,13 @@ func Test_Redis_Get(t *testing.T) { result, err := testStore.Get(key) require.NoError(t, err) require.Equal(t, val, result) + + keys, err := testStore.Keys() + require.NoError(t, err) + require.Len(t, keys, 1) } -func Test_Redis_Set_Expiration(t *testing.T) { +func Test_Redis_Expiration(t *testing.T) { var ( key = "john" val = []byte("doe") @@ -61,14 +69,14 @@ func Test_Redis_Set_Expiration(t *testing.T) { require.NoError(t, err) time.Sleep(1100 * time.Millisecond) -} - -func Test_Redis_Get_Expired(t *testing.T) { - key := "john" result, err := testStore.Get(key) require.NoError(t, err) require.Zero(t, len(result)) + + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) } func Test_Redis_Get_NotExist(t *testing.T) { @@ -92,6 +100,10 @@ func Test_Redis_Delete(t *testing.T) { result, err := testStore.Get(key) require.NoError(t, err) require.Zero(t, len(result)) + + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) } func Test_Redis_Reset(t *testing.T) { @@ -103,6 +115,10 @@ func Test_Redis_Reset(t *testing.T) { err = testStore.Set("john2", val, 0) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Len(t, keys, 2) + err = testStore.Reset() require.NoError(t, err) @@ -113,6 +129,10 @@ func Test_Redis_Reset(t *testing.T) { result, err = testStore.Get("john2") require.NoError(t, err) require.Zero(t, len(result)) + + keys, err = testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) } func Test_Redis_Close(t *testing.T) { @@ -184,6 +204,10 @@ func Test_Redis_Initalize_WithURL_TLS(t *testing.T) { err = testStoreUrl.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUrl.Close()) } @@ -226,6 +250,10 @@ func Test_Redis_Initalize_WithURL_TLS_Verify(t *testing.T) { err = testStoreUrl.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUrl.Close()) } @@ -249,6 +277,10 @@ func Test_Redis_Initalize_With_Secure_URL(t *testing.T) { err = testStoreUrl.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUrl.Close()) } @@ -273,6 +305,10 @@ func Test_Redis_Universal_Addrs(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) } @@ -299,6 +335,10 @@ func Test_Redis_Universal_With_URL_Undefined(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) } @@ -325,6 +365,10 @@ func Test_Redis_Universal_With_URL_Defined(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) } @@ -352,6 +396,10 @@ func Test_Redis_Universal_With_HostPort(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) } @@ -380,6 +428,10 @@ func Test_Redis_Universal_With_HostPort_And_URL(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) } @@ -410,6 +462,10 @@ func Test_Redis_Cluster(t *testing.T) { err = testStoreUniversal.Delete(key) require.NoError(t, err) + keys, err := testStore.Keys() + require.NoError(t, err) + require.Zero(t, keys) + require.Nil(t, testStoreUniversal.Close()) }