ZRANGEBYSCORE

    Returns all the elements in the sorted set at with a score between min and max (including elements with score equal to min or max). The elements are considered to be ordered from low to high scores.

    The elements having the same score are returned in lexicographical order (this follows from a property of the sorted set implementation in Redis and does not involve further computation).

    The optional LIMIT argument can be used to only get a range of the matching elements (similar to SELECT LIMIT offset, count in SQL). A negative count returns all elements from the offset. Keep in mind that if offset is large, the sorted set needs to be traversed for offset elements before getting to the elements to return, which can add up to O(N) time complexity.

    The optional WITHSCORES argument makes the command return both the element and its score, instead of the element alone. This option is available since Redis 2.0.

    min and max can be -inf and , so that you are not required to know the highest or lowest score in the sorted set to get all elements from or up to a certain score.

    1. ZRANGEBYSCORE zset (1 5

    Will return all elements with 1 < score <= 5 while:

    Will return all the elements with 5 < score < 10 (5 and 10 excluded).

    : list of elements in the specified score range (optionally with their scores).

    1. dragonfly> ZADD myzset 1 "one"
    2. (integer) 1
    3. dragonfly> ZADD myzset 2 "two"
    4. dragonfly> ZADD myzset 3 "three"
    5. (integer) 1
    6. dragonfly> ZRANGEBYSCORE myzset -inf +inf
    7. 2) "two"
    8. 3) "three"
    9. dragonfly> ZRANGEBYSCORE myzset 1 2
    10. 1) "one"
    11. 2) "two"
    12. 1) "two"
    13. dragonfly> ZRANGEBYSCORE myzset (1 (2

    Normally ZRANGEBYSCORE is simply used in order to get range of items where the score is the indexed integer key, however it is possible to do less obvious things with the command.

    For example a common problem when implementing Markov chains and other algorithms is to select an element at random from a set, but different elements may have different weights that change how likely it is they are picked.

    Imagine you have elements A, B and C with weights 1, 2 and 3. You compute the sum of the weights, which is 1+2+3 = 6

    At this point you add all the elements into a sorted set using this algorithm:

    This means that you set:

    1. A to score 0.16
    2. B to score .5
    3. C to score 1

    Since this involves approximations, in order to avoid C is set to, like, 0.998 instead of 1, we just modify the above algorithm to make sure the last score is 1 (left as an exercise for the reader…).

    At this point, each time you want to get a weighted random element, just compute a random number between 0 and 1 (which is like calling rand() in most languages), so you can just do: