diff --git a/lib/redis.rb b/lib/redis.rb index 51080a14e..2c0a522f4 100644 --- a/lib/redis.rb +++ b/lib/redis.rb @@ -1754,6 +1754,21 @@ def zscore(key, member) end end + # Get the scores associated with the given members in a sorted set. + # + # @example Get the score for member "a" + # redis.zmscore("zset", "a", "no_member", "b") + # # => [32.0, nil, 64.0] + # + # @param [String] key + # @param [Array] members + # @return [[Array] scores of the members + def zmscore(key, *members) + synchronize do |client| + client.call([:zmscore, key] + members)&.map(&:to_f) + end + end + # Return a range of members in a sorted set, by index. # # @example Retrieve all members from a sorted set diff --git a/lib/redis/distributed.rb b/lib/redis/distributed.rb index 0ffaa2bd2..af644eaf3 100644 --- a/lib/redis/distributed.rb +++ b/lib/redis/distributed.rb @@ -626,6 +626,11 @@ def zscore(key, member) node_for(key).zscore(key, member) end + # Get the scores associated with the given members in a sorted set. + def zmscore(key, *members) + node_for(key).zmscore(key, *members) + end + # Return a range of members in a sorted set, by index. def zrange(key, start, stop, **options) node_for(key).zrange(key, start, stop, **options) diff --git a/test/lint/sorted_sets.rb b/test/lint/sorted_sets.rb index 40a6f02ea..44f6693e6 100644 --- a/test/lint/sorted_sets.rb +++ b/test/lint/sorted_sets.rb @@ -293,6 +293,16 @@ def test_zscore assert_equal(+Float::INFINITY, r.zscore("bar", "s2")) end + def test_zmscore + target_version "6.2.0" do + r.zadd "foo", [1, "s1", 2, "s2"] + + assert_equal [1.0, 2.0], r.zmscore("foo", "s1", "s2") + assert_equal [1.0, 0.0, 2.0], r.zmscore("foo", "s1", "no_member", "s2") + assert_equal [0.0], r.zmscore("no_key", "no_member") + end + end + def test_zremrangebyrank r.zadd "foo", 10, "s1" r.zadd "foo", 20, "s2"