Redis RESP2 vs RESP3 Reply Decoder

Paste a reply and see which types are RESP3-only, and what a RESP2 connection would have sent in their place. This is the page for working out why a result changed shape after a client upgrade.

Paste below, or drop a file anywhere on this panel

Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.

The answer appears here

Paste on the left and press Compare. Nothing leaves this tab.

Wanted a different tool?

Examples

Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.

A RESP3 map

What a RESP2 client would have received instead: a flat array it has to pair up itself

%2\r\n$6\r\nserver\r\n$5\r\nredis\r\n$7\r\nversion\r\n$5\r\n7.2.4\r\n

Identical on both

A reply using no RESP3 types, which decodes the same whether or not the client sent HELLO 3

*2\r\n$3\r\nfoo\r\n:42\r\n

Common mistakes

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

  1. Assuming a client upgrade cannot change reply shapes

    RESP3 is negotiated per connection with HELLO 3. The same command returns a flat array on RESP2 and a real map on RESP3, so code indexing by position breaks.

    Instead:Check whether your client sends HELLO 3, and read replies by key rather than by index where the protocol allows it.

  2. Relying on the order of a set reply

    SMEMBERS on RESP2 returns an array, which implies an order that does not exist. On RESP3 it is a set and the client may hand you an unordered collection.

    Instead:Sort explicitly if order matters. It never came from Redis.

RESP3 changes the shape of replies, not just their encoding

The protocol version is negotiated per connection with HELLO. A client that never sends HELLO 3 gets RESP2 forever, and the same command returns a different structure on each, which is why a library upgrade can change your code's behaviour without any server change.

A map stops being a flat array

On RESP2, a command like CONFIG GET or XPENDING returns an array of alternating keys and values, and every client pairs them up itself. On RESP3 the same reply is a real map. Client libraries usually surface this as a dictionary rather than a list, which is the change most likely to break code that indexed the array by position.

A set stops being an array

SMEMBERS on RESP2 returns an array, which implies an order that does not exist. On RESP3 it returns a set, and a client is free to hand you an unordered collection. Code that relied on the incidental ordering of a RESP2 array will not survive that, and nothing will warn it.

Push messages become distinguishable

On RESP2, a pub/sub message is an ordinary array, so a client has to track subscription state to know whether the thing it just read was a reply or a message. RESP3 gives push its own type, which is what makes client-side caching invalidation possible at all.

Doubles and booleans stop being strings

ZSCORE on RESP2 returns a bulk string the client parses; on RESP3 it is a double. A boolean is an integer 1 or 0 on RESP2 and a real boolean on RESP3. Neither loses information, but the type your code receives changes.

What this cannot see

It cannot tell you whether your client sent HELLO 3, only what the bytes in front of it use. If a reply contains no RESP3-only types it is identical on both versions, and this page will say so rather than guess. Whether your server supports RESP3 at all depends on it being Redis 6 or newer.

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 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 ZRANGE Query Builder REV reverses the argument order 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