Dragonfly and KeyDB extensions
RespireCommands.Dragonfly and RespireCommands.KeyDb expose pre-encoded descriptors
for compatible-server extensions. Execute them with the normal catalog API and dispose
each RespireResult. These are protocol-shaped results; no vendor package is required.
await using var dragonfly = RespireClient.Create("redis://dragonfly:6379");
await using var keydb = RespireClient.Create("redis://keydb:6379");
using RespireResult rate = await dragonfly.ExecuteAsync(
RespireCommands.Dragonfly.CL_THROTTLE, "user:42", 20, 120, 60, 1);
bool limited = rate[0].AsInteger() != 0;
long retryAfterSeconds = rate[3].AsInteger();
using RespireResult added = await dragonfly.ExecuteAsync(
RespireCommands.Dragonfly.SADDEX, "online", 60, "alice", "bob");
using RespireResult expiry = await keydb.ExecuteAsync(
RespireCommands.KeyDb.EXPIREMEMBER, "online", "alice", 30);
CL.THROTTLE returns five integers: limited flag, total limit, remaining capacity,
retry delay, and reset delay. A retry delay of -1 means the request was allowed.
Per the vendor documentation, SADDEX adds members with an expiry in seconds;
its optional KEEPTTL preserves existing members' TTLs. EXPIREMEMBER sets a
member expiry and optionally accepts ms instead of its default seconds. The
smoke scenarios exercise default expiry behavior, not those two options. The server validates options and returns its
own errors, including unsupported commands, wrong types, and denied ACL permissions.
Audited descriptors
All names below are exact wire commands. The C# identifiers replace punctuation and
spaces with underscores, for example DFLYCLUSTER_SLOT_MIGRATION_STATUS sends
DFLYCLUSTER SLOT-MIGRATION-STATUS as two command words.
| Server | Commands |
|---|---|
| Dragonfly data and rate limits | STICK, CL.THROTTLE, SADDEX, FIELDEXPIRE, FIELDTTL, RM, CF.COMPACT, JSON.DEBUG FIELDS, JSON.DEBUG HELP |
| Dragonfly script diagnostics | SCRIPT LIST, SCRIPT LATENCY |
| Dragonfly memory diagnostics | MEMORY ARENA, MEMORY DECOMMIT, MEMORY DEFRAGMENT |
| Dragonfly Cluster administration | DFLYCLUSTER CONFIG, DFLYCLUSTER FLUSHSLOTS, DFLYCLUSTER GETSLOTINFO, DFLYCLUSTER SLOT-MIGRATION-STATUS |
| KeyDB member expiry | EXPIREMEMBER, EXPIREMEMBERAT, PEXPIREMEMBERAT |
| Other KeyDB extensions | KEYDB.CRON, KEYDB.HRENAME, KEYDB.MEXISTS, KEYDB.NHGET, KEYDB.NHSET, REPLPING |
The canonical catalog audit
records the exact server versions and source commits used for the descriptor inventory.
Documentation may cover extensions newer than your installed server. Sources
records audit provenance, not runtime availability or equivalent semantics across servers.
For example, Dragonfly's HSETEX argument form differs from Redis's; use the existing
RespireCommands.Hash.HSETEX descriptor with the arguments documented by your server.
KeyDB's subkey forms of TTL, PTTL, and PERSIST also use existing descriptors.
DFLYCLUSTER administration requires Dragonfly's admin listener (--admin_port),
which should be targeted explicitly. CONFIG, FLUSHSLOTS, and RM change server
state or delete data; the catalog does not emulate or broadcast them. Server ACLs apply.
Private inter-server replication protocols are outside this catalog expansion.
These commands retain the raw execution contract: arguments are separate binary-safe
tokens, caller keys are explicit, and prefixed views reject immediate catalog execution.
Key-based descriptors route using their first key argument. Administrative commands and
the RM cursor have no routing key and run on one selected node, without Cluster fan-out.
KEYDB.MEXISTS key [key ...] is a multi-key command. With UseCluster, raw execution validates
all its key slots before I/O and routes using the first key; it does not split the request across
nodes. Supply keys sharing a hash slot (for example, {user}:a and {user}:b);
incompatible keys fail locally with CROSSSLOT. See raw Cluster validation
for the supported layouts and unknown-command contract. Its result contains
one boolean per supplied key, in input order (integer 0/1 replies under RESP2).
For node-specific administration, use a standalone client aimed at the intended endpoint.
These vendor descriptors are not added to the deferred raw API's supported key layouts;
unsupported layouts continue to fail before enqueueing.
Typed facets continue to provide their documented Redis/Valkey contracts; selecting a
descriptor does not negotiate a different typed API.
The real-server smoke tests verify CL.THROTTLE, SADDEX, FIELDTTL, and
FIELDEXPIRE on Dragonfly 2.0.0, and EXPIREMEMBER, PEXPIREMEMBERAT,
KEYDB.HRENAME, and KEYDB.MEXISTS on KeyDB 6.3.4, each under RESP2 and RESP3.
These scenarios do not certify every descriptor against those image versions. They carry
the CompatibleServers test category and can also be selected or excluded by the
ServerExtensionIntegrationTests class filter. CI runs them without skips. The KeyDB
fixture requires a Docker engine capable of running its pinned x86_64 image, either
natively or through configured emulation; the test process architecture alone does not
determine the architecture of a local or remote Docker engine.
References: Dragonfly command documentation, Dragonfly Cluster administration, KeyDB commands, and KeyDB 6.3.4 command table.