Skip to main content

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.

ServerCommands
Dragonfly data and rate limitsSTICK, CL.THROTTLE, SADDEX, FIELDEXPIRE, FIELDTTL, RM, CF.COMPACT, JSON.DEBUG FIELDS, JSON.DEBUG HELP
Dragonfly script diagnosticsSCRIPT LIST, SCRIPT LATENCY
Dragonfly memory diagnosticsMEMORY ARENA, MEMORY DECOMMIT, MEMORY DEFRAGMENT
Dragonfly Cluster administrationDFLYCLUSTER CONFIG, DFLYCLUSTER FLUSHSLOTS, DFLYCLUSTER GETSLOTINFO, DFLYCLUSTER SLOT-MIGRATION-STATUS
KeyDB member expiryEXPIREMEMBER, EXPIREMEMBERAT, PEXPIREMEMBERAT
Other KeyDB extensionsKEYDB.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.