Skip to main content

ZREMRANGEBYSCORE

Introduction

In Dragonfly, as well as in Redis and Valkey, the ZREMRANGEBYSCORE command is used to remove all members from a sorted set that have a score within a given range. This command is often used in scenarios where you need to efficiently prune entries in a sorted set based on their scores, such as removing expired sessions or data points from a leaderboard.

Syntax

ZREMRANGEBYSCORE key min max
  • Time complexity: O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements removed by the operation.
  • ACL categories: @write, @sortedset, @slow

Parameter Explanations

  • key: The name of the sorted set.
  • min and max:
    • The minimum and maximum score values to filter the members to be removed.
    • By default, they are inclusive. To make them exclusive, use the ( character before the score.
    • The +inf and -inf special values can be used to specify positive and negative infinity scores, respectively.

Return Values

  • The command returns an integer indicating the number of members removed from the sorted set.

Code Examples

Basic Example

Remove members with scores between 1 and 3:

dragonfly$> ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four"
(integer) 4

dragonfly$> ZREMRANGEBYSCORE myzset 1 3
(integer) 3

dragonfly$> ZRANGE myzset 0 -1 WITHSCORES
1) "four"
2) "4"

Removing Members with Scores Below a Certain Value

Remove all members with scores less than or equal to 2:

dragonfly$> ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four"
(integer) 4

dragonfly$> ZREMRANGEBYSCORE myzset -inf 2
(integer) 2

dragonfly$> ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
3) "four"
4) "4"

Removing Members with Scores in a Floating-point Range

Use floating-point numbers to target a specific score range. In this case, remove members with scores between 2.5 and 4.5:

dragonfly$> ZADD myzset 2.5 "apple" 3.5 "banana" 1.5 "cherry"
(integer) 3

dragonfly$> ZREMRANGEBYSCORE myzset 2.5 4.5
(integer) 2

dragonfly$> ZRANGE myzset 0 -1 WITHSCORES
1) "cherry"
2) "1.5"

Removing All Members Above a Certain Score

To remove all members with scores greater than 3.5, use +inf:

dragonfly$> ZADD myzset 2.5 "cat" 4 "dog" 6 "elephant"
(integer) 3

dragonfly$> ZREMRANGEBYSCORE myzset 3.5 +inf
(integer) 2

dragonfly$> ZRANGE myzset 0 -1 WITHSCORES
1) "cat"
2) "2.5"

Best Practices

  • Use -inf and +inf strategically to clear lower or upper bounds of the sorted set without hardcoding exact score ranges.
  • If you need to maintain a capped sorted set based on scores (e.g., expiring items after a threshold), periodically use ZREMRANGEBYSCORE.

Common Mistakes

  • Forgetting that the score range is inclusive. If you mean to exclude the boundary value, you must use the special syntax of (min or (max to make the range exclusive.
  • Trying to use non-numeric values for the min and max parameters; only valid floats, integers, and the special values -inf and +inf are allowed.

FAQs

Can I use exclusive ranges?

Yes, you can use parentheses to exclude a boundary from the range. For example, ZREMRANGEBYSCORE myzset (2 5 will remove all elements with scores greater than 2 but less than or equal to 5.

What happens if no elements fall within the score range?

If no elements in the sorted set fall within the provided score range, ZREMRANGEBYSCORE simply returns 0, indicating that no elements were removed.

Can the score range include negative values?

Yes, negative scores are allowed in sorted sets. You can use negative values in both the min and max parameters to define a valid range in the sorted set.