Redis probe
The Redis probe sends an ordered sequence of Redis commands to a server and records the reply to each one. VirtuProbe speaks RESP directly, written against the protocol specification rather than wrapped around a client library, so every command and every reply is visible as it went over the connection.
A probe is a sequence rather than a single query: authenticate, write a key, read it back, check the TTL, and every step is one row in the history with its own reply.
Two modes
Section titled “Two modes”Switch with the Action / Advanced toggle above the editor.
Action mode picks one thing to do and builds the commands for it. It runs as ordinary Redis commands, so every one of them still appears in the history.
Advanced mode is the command sequence itself, for the cases Action mode does not cover.

Connection settings
Section titled “Connection settings”| Field | Description |
|---|---|
| Host | Hostname or IP of the Redis server |
| Port | Server port (default: 6379) |
| Database | Database index. 0 is the Redis default and sends no SELECT |
| TLS mode | Disabled, Required, or Verify certificate and hostname |
| Trust self-signed certificates | Skip certificate validation for this probe. Lab use |
| Credential | A Basic credential from the credential store |
The credential is sent as an AUTH command, so its reply appears in the history like any other. A NOAUTH refusal is therefore a visible result rather than a connection that silently did not
work.
Action mode
Section titled “Action mode”| Action | What it sends | Fields |
|---|---|---|
| Ping the server | PING | none |
| Read a key | GET and the commands the chosen return needs | Key, Return |
| Write a key | SET, with an expiry when one is given | Key, Value, Expire after (seconds) |
| Server info | INFO | Section, Field |
| Find keys | SCAN | Pattern, Limit |
Read a key has a Return selector: The value, Whether it exists, Time to live or Its type. They are different questions, and a key holding an empty string answers the first one with nothing while still existing.
Find keys uses SCAN rather than KEYS, because KEYS blocks the server while it walks the
whole keyspace. Limit bounds how much of the keyspace one send covers.
Server info takes a Section such as server, clients, memory or replication, and
blank returns everything. Field names one field, such as redis_version, and highlights it in
the reply.
Advanced mode
Section titled “Advanced mode”The Command sequence section holds the commands in the order they will be sent.
| Field | Description |
|---|---|
| Command | The Redis command, for example SET or HGETALL |
| Arguments | Separated by spaces. Use quotes to keep a value with spaces together |
| Expected reply | (optional) The command passes only if its reply contains this |
| Enabled | Clear it to keep a command in the probe without sending it |
A command that modifies the server carries a Modifies target chip, and one VirtuProbe does not recognize carries Unrecognised command. An unrecognized command is still sent, since sending something the server has never heard of is a legitimate thing to want.
Response
Section titled “Response”Each send produces an Exchanges list, one row per command, which expands to show the reply. The row carries the command, the reply type, the duration, and an error if the server returned one.

The reply type is the RESP kind: SIMPLE_STRING, ERROR, INTEGER, BULK_STRING, ARRAY, NULL
and so on. A key that is absent answers NULL while a key holding an empty string answers BULK_STRING, and
the reply text is empty either way.
Extractors
Section titled “Extractors”| Extractor | Returns |
|---|---|
REDIS_SUCCESS | "true" when the transport was fine and every exchange met its expectation |
REDIS_REPLY | The reply text of one exchange. Expression names a command, such as GET or GET user:1; blank means the last exchange |
REDIS_REPLY_TYPE | The RESP kind of a reply |
REDIS_INTEGER | An integer reply as text: DBSIZE, TTL, EXISTS, the count from a DEL. Blank rather than zero when the reply was not an integer |
REDIS_ARRAY_ITEMS | The elements of an array reply, one per line, which is the shape an ITERATE step consumes. A SCAN reply is unwrapped so the cursor is not iterated as though it were a key |
REDIS_INFO_FIELD | One field out of an INFO reply, such as redis_version. The expression is required here |
REDIS_ERROR | The server error message of an exchange, blank when it did not answer with an error |
An error reply is a normal result. NOAUTH against an unauthenticated connection, or WRONGTYPE
against a key of the wrong shape, is frequently the finding a probe went looking for.
See Extractors for the full list.
Chains
Section titled “Chains”Redis is a first-class chain step. {{variable}} placeholders resolve into the host, the database
and the command arguments before the sequence is sent. A common pattern is HTTP then Redis: call an
API that is supposed to cache something, then read the key and assert on it with REDIS_REPLY.
REDIS_ARRAY_ITEMS feeds an ITERATE step directly, so a SCAN for session:* can drive one child
step per key.
A local server to test against
Section titled “A local server to test against”virtuprobe-docker ships a Redis target. Bring up either the standalone one or the whole fleet:
cd virtuprobe-docker/redis-simple && docker compose up -dIt listens on 6379 with the password Password123!, and it is seeded with one key of each type so
a read exercises every branch of the type detection: greeting and counter and expiring as
strings, queue:jobs as a list, user:1 as a hash, tags:active as a set, leaderboard as a
sorted set, key with spaces, and binary:crlf, whose value carries a line break.
The password means a probe exercises the AUTH exchange, and both the success and the refusal show
up as replies.
Implementation notes
Section titled “Implementation notes”- Hand-rolled RESP. The client is written against the protocol specification, so a probe can send a command the server will reject and still show you exactly what came back.
- Framed by length, not by scanning for a terminator. A bulk string carries its own length, so a
value containing a line break survives a round trip intact. The seeded
binary:crlfkey exists to prove it. - The TLS field is
tlsMode, spelled the way MongoDB spells it. MySQL and PostgreSQL call the same ideasslMode. This matters only when writing a probe file by hand or over MCP, where an unrecognized key is dropped in silence and the probe then connects in the clear.