From 431f9af43e98414490d6d5b20c7d03ff4bd644eb Mon Sep 17 00:00:00 2001 From: Qiu shao <504250439@Qq.com> Date: Sat, 16 Dec 2023 14:49:16 +0800 Subject: [PATCH] feat:add redis ExistsMany method (#3769) --- core/stores/redis/redis.go | 27 +++++++++++++++++++++++++++ core/stores/redis/redis_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index d8301a8c..bf42bcde 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -467,6 +467,33 @@ func (s *Redis) ExistsCtx(ctx context.Context, key string) (val bool, err error) return } +// ExistsMany is the implementation of redis exists command. +// checks the existence of multiple keys in Redis using the EXISTS command. +func (s *Redis) ExistsMany(keys ...string) (int64, error) { + return s.ExistsManyCtx(context.Background(), keys...) +} + +// ExistsManyCtx is the implementation of redis exists command. +// checks the existence of multiple keys in Redis using the EXISTS command. +func (s *Redis) ExistsManyCtx(ctx context.Context, keys ...string) (val int64, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + v, err := conn.Exists(ctx, keys...).Result() + if err != nil { + return err + } + + val = v + return nil + }, acceptable) + + return +} + // Expire is the implementation of redis expire command. func (s *Redis) Expire(key string, seconds int) error { return s.ExpireCtx(context.Background(), key, seconds) diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 8053a661..626c89f6 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -224,6 +224,36 @@ func TestRedisTLS_Exists(t *testing.T) { }) } +func TestRedis_ExistsMany(t *testing.T) { + runOnRedis(t, func(client *Redis) { + // Attempt to create a new Redis instance with an incorrect type and call ExistsMany + _, err := New(client.Addr, badType()).ExistsMany("key1", "key2") + assert.NotNil(t, err) + + // Check if key1 and key2 exist, expecting that they do not + val, err := client.ExistsMany("key1", "key2") + assert.Nil(t, err) + assert.Equal(t, int64(0), val) + + // Set the value for key1 and check if key1 exists + assert.Nil(t, client.Set("key1", "value1")) + val, err = client.ExistsMany("key1") + assert.Nil(t, err) + assert.Equal(t, int64(1), val) + + // Set the value for key2 and check if key1 and key2 exist + assert.Nil(t, client.Set("key2", "value2")) + val, err = client.ExistsMany("key1", "key2") + assert.Nil(t, err) + assert.Equal(t, int64(2), val) + + // Check if key1, key2, and a non-existent key3 exist, expecting that key1 and key2 do + val, err = client.ExistsMany("key1", "key2", "key3") + assert.Nil(t, err) + assert.Equal(t, int64(2), val) + }) +} + func TestRedis_Eval(t *testing.T) { runOnRedis(t, func(client *Redis) { _, err := New(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"})