Redis ZRANGE Query Builder

Build a ZRANGE. The bug this exists to prevent: with REV, the higher bound comes first. Writing the arguments in the order you say them out loud returns an empty result with no error at all.

What to query
The range

With REV the higher bound comes FIRST. Emitting the bounds in the order they were written produces an empty result rather than an error, which is the trap this tool exists for.

The builder swaps the two bounds for you when this is on.

Not legal with BYLEX, because a lexicographic range assumes every member shares one score.

zrange-command.txt

updates as you type

    Examples

    Worked setups you can load into the form above. Each one is a decision the generator makes differently, and the reason it makes it.

    A reversed range

    The higher bound comes first, which is what REV requires

    key
    leaderboard
    by
    score
    min
    100
    max
    500
    reverse
    yes

    LIMIT on an index range

    A combination Redis rejects, because index ranges already take start and stop

    key
    leaderboard
    by
    index
    min
    0
    max
    -1
    limit
    0 10

    Common mistakes

    These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.

    1. Writing REV bounds low then high

      REV expects the higher bound first. The other order describes an empty range and returns nothing, with no error.

      Instead:Put the high bound first when using REV.

    2. Paginating with an index range and LIMIT

      LIMIT is not valid with an index range.

      Instead:Use BYSCORE with LIMIT offset count.

    3. Using BYLEX on a set with varying scores

      Lexicographic order only holds when every member shares a score. Otherwise the result is not alphabetical.

      Instead:Use a single score, conventionally 0, or use BYSCORE.

    4. Dropping the parenthesis on an exclusive bound

      Bounds are inclusive by default, so the range quietly includes one extra element.

      Instead:Keep ( attached to the value.

    One command, three range types, and an argument order that flips

    Redis 6.2 merged six commands into ZRANGE. The options are clearer than the old names, and two of them interact in ways that fail silently.

    REV swaps which bound comes first

    Without REV you give the low bound then the high one. With REV you give the HIGH bound then the low one. Getting it the wrong way round is not an error: it describes an empty range, so Redis returns nothing and nothing explains why. This is the most common ZRANGE bug there is.

    LIMIT only exists for BYSCORE and BYLEX

    An index range already takes a start and a stop, so an offset and count would be meaningless and Redis rejects the combination. For score ranges LIMIT is how pagination works, and it is the reason to prefer BYSCORE over index ranges for paging.

    BYLEX is only meaningful when every score is identical

    Lexicographic ordering assumes the set is ordered by member. If scores differ, the ordering is by score first, and the result is not the alphabetical range it appears to be. Nothing warns about this, because it is a valid query over a set that happens to be shaped differently than assumed.

    A leading parenthesis makes a bound exclusive

    Bounds are inclusive by default and the parenthesis is the only way to exclude an endpoint. It is easy to lose when a bound is built by string concatenation, and losing it produces an off-by-one that is invisible in the query.

    The old commands still work

    ZRANGEBYSCORE, ZREVRANGE and the rest are soft-deprecated rather than removed. On a server older than 6.2 they are the only option, because ZRANGE there does not accept BYSCORE, BYLEX or REV.

    More redis tools

    Redis Hash Slot Calculator Which of the 16,384 slots does this key land in? Redis Hash Tag Tester Will these keys survive a multi-key command? Redis RESP Protocol Decoder Read what the server actually sent Redis RESP2 vs RESP3 Reply Decoder What the same reply looks like on each protocol Redis Command to RESP Exactly what your client puts on the socket Redis Glob Pattern Tester Redis globs are not shell globs Redis Connection URL Parser The path is the database number Redis Memory Unit Converter 1g and 1gb are not the same number Redis TTL Converter -1 and -2 are not durations Redis Stream ID Parser The first half is a millisecond timestamp redis.conf Validator Will Redis start with this file? Redis Production Config Linter The settings that cause incidents redis.conf to CONFIG SET Which of these can you change without a restart? Redis ACL Rule Decoder What does this user actually get? Redis ACL Validator Find the rule that does nothing Redis INFO Analyzer The numbers INFO does not print Redis SLOWLOG Analyzer What blocked everyone else Redis CLUSTER NODES Parser Read the topology, and find the gap Redis Cluster Slot Distribution Who owns how much, and what is missing Redis Keyspace Notification Flags Why your events never arrive Redis Memory Calculator The encoding decides, not the data Redis Key Count to Memory The fixed cost per key Redis Encoding Threshold Calculator One field more, several times the memory Redis Bitmap Memory Calculator Sized by the highest bit, not the set ones Redis HyperLogLog Calculator 12 KB whether you count a thousand or a billion Redis Cluster Sizing Only 60% of each node is usable Redis RDB and AOF Size Calculator The fork needs memory, not disk Redis Replication Bandwidth Calculator How long the backlog actually covers Redis Connection Pool Calculator More connections is not more throughput Redis Pipeline Calculator It removes round trips, not work Redis Cache Hit Rate Calculator 99% to 90% is ten times the backend load Redis Eviction Policy Simulator volatile- with no TTLs is noeviction Redis Cost Estimator Your rates, so nothing goes stale Redis Config File Generator A redis.conf with the reasons in it Redis ACL Generator A user that can do exactly one job Redis Maxmemory Config Generator The limit, and the headroom it needs Redis Persistence Config Generator How much you can afford to lose Redis Lua Script Generator Atomic, and short enough to stay that way Redis TLS Config Generator Encrypted, and the old port actually closed Redis Sentinel Config Generator Failover that can actually be authorised Redis Cluster Config Generator Three primaries, and the bus port open Redis Docker Compose Generator Local Redis that is not on the internet Redis Client Config Generator Timeouts on both sides, and a sane pool Redis MEMORY STATS Analyzer Which number actually matters Redis Bigkeys Output Analyzer Elements are not bytes Redis CLIENT LIST Analyzer Find the connection hurting you Redis LATENCY Report Analyzer An empty report may mean nothing was recorded Redis Keyspace Prefix Analyzer Which key family is growing Redis SET Command Builder A plain SET clears the TTL Redis SCAN Iteration Planner COUNT is a hint, not a page size Redis Key Name Validator Legal is not the same as workable Redis Cluster Compatibility Checker Works now, breaks when you shard

    Elsewhere on the site