diff --git a/core/stores/kv/store.go b/core/stores/kv/store.go index debed1d6dae8..d9aa687ad7c0 100644 --- a/core/stores/kv/store.go +++ b/core/stores/kv/store.go @@ -73,6 +73,7 @@ type ( ZrevrangebyscoreWithScores(key string, start, stop int64) ([]redis.Pair, error) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64, page, size int) ([]redis.Pair, error) Zscore(key string, value string) (int64, error) + Zrevrank(key, field string) (int64, error) } clusterStore struct { @@ -644,6 +645,15 @@ func (cs clusterStore) Zscore(key string, value string) (int64, error) { return node.Zscore(key, value) } +func (cs clusterStore) Zrevrank(key, field string) (int64, error) { + node, err := cs.getRedis(key) + if err != nil { + return 0, err + } + + return node.Zrevrank(key, field) +} + func (cs clusterStore) getRedis(key string) (*redis.Redis, error) { if val, ok := cs.dispatcher.Get(key); !ok { return nil, ErrNoRedisNode diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 449e5d237949..52219aa926b2 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -1273,6 +1273,20 @@ func (s *Redis) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64 return } +func (s *Redis) Zrevrank(key string, field string) (val int64, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + val, err = conn.ZRevRank(key, field).Result() + return err + }, acceptable) + + return +} + func (s *Redis) String() string { return s.Addr } diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 9a8ab2e7d8e7..f804160f9c8c 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -584,6 +584,9 @@ func TestRedis_SortedSet(t *testing.T) { rank, err := client.Zrank("key", "value2") assert.Nil(t, err) assert.Equal(t, int64(1), rank) + rank, err = client.Zrevrank("key", "value1") + assert.Nil(t, err) + assert.Equal(t, int64(2), rank) _, err = NewRedis(client.Addr, "").Zrank("key", "value4") assert.NotNil(t, err) _, err = client.Zrank("key", "value4")