diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index caf05a22..dd5687e4 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -1282,6 +1282,41 @@ func (s *Redis) Sdiffstore(destination string, keys ...string) (val int, err err return } +// Sinter is the implementation of redis sinter command. +func (s *Redis) Sinter(keys ...string) (val []string, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + val, err = conn.SInter(keys...).Result() + return err + }, acceptable) + + return +} + +// Sinterstore is the implementation of redis sinterstore command. +func (s *Redis) Sinterstore(destination string, keys ...string) (val int, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + v, err := conn.SInterStore(destination, keys...).Result() + if err != nil { + return err + } + + val = int(v) + return nil + }, acceptable) + + return +} + // Ttl is the implementation of redis ttl command. func (s *Redis) Ttl(key string) (val int, err error) { err = s.brk.DoWithAcceptable(func() error { diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index f3a1500c..2416fffc 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -638,6 +638,16 @@ func TestRedis_Set(t *testing.T) { num, err = client.Sdiffstore("key4", "key1", "key2") assert.Nil(t, err) assert.Equal(t, 1, num) + _, err = New(client.Addr, badType()).Sinter("key1", "key2") + assert.NotNil(t, err) + vals, err = client.Sinter("key1", "key2") + assert.Nil(t, err) + assert.ElementsMatch(t, []string{"2", "3", "4"}, vals) + _, err = New(client.Addr, badType()).Sinterstore("key4", "key1", "key2") + assert.NotNil(t, err) + num, err = client.Sinterstore("key4", "key1", "key2") + assert.Nil(t, err) + assert.Equal(t, 3, num) }) }