Redis CompatibilityΒΆ
Moon implements a large subset of the Redis command surface with wire-level compatibility for RESP2 and RESP3. This document tracks known incompatibilities.
Protocol CompatibilityΒΆ
| Protocol | Status |
|---|---|
| RESP2 | Full |
| RESP3 (HELLO 3) | Full |
| Inline commands | Full |
| Pipelining | Full |
| MULTI/EXEC | Full |
| Pub/Sub (RESP2 push) | Full |
| Pub/Sub (RESP3 push framing) | Partial β RESP2 framing used even under RESP3 |
Client Compatibility MatrixΒΆ
| Client | Language | Status | Notes |
|---|---|---|---|
| redis-py | Python | Tested in CI | Basic ops, pipelines, INFO parsing |
| go-redis | Go | Tested in CI | Basic ops, hash, pipelines |
| redis-rs | Rust | Used in integration tests | Full coverage |
| jedis | Java | Planned | |
| lettuce | Java | Planned | |
| ioredis | Node.js | Planned | |
| StackExchange.Redis | C# | Planned | |
| hiredis | C | Planned |
Known IncompatibilitiesΒΆ
The command registry (src/command/metadata.rs) is the source of truth: 258
commands as of this writing, each with an arity, read/write flag, and ACL
category, checked by cargo test command::metadata::tests. The table below
is regenerated against that registry β previous editions of this doc
incorrectly listed WAIT and FUNCTION * as unimplemented; both are live.
CommandsΒΆ
| Command | Status | Detail |
|---|---|---|
DEBUG DIGEST |
Not implemented | Use DBSIZE for parity checks |
DEBUG OBJECT |
Implemented | Redis-compatible one-line summary (encoding/refcount/serializedlength) |
ACL LOG |
Implemented | Real entries pushed from every command-dispatch path (single/sharded/monoio handlers) on auth/perm failures; ACL LOG RESET clears the ring |
CLIENT LIST / CLIENT INFO |
Implemented, some fields are placeholders | Full Redis field set is present (id, addr, laddr, fd, name, age, idle, flags, db, sub, psub, ssub, multi, watch, qbuf*, argv-mem, multi-mem, tot-net-in/out, rbs, rbp, obl, oll, omem, tot-mem, events, cmd, user, redir, resp, lib-name, lib-ver) so key=value parsers never choke on a missing key, but laddr, tot-net-in/out, rbs/rbp/obl/oll/omem, cmd, and events are not yet wired to live per-connection data (honest placeholder values, not real telemetry). redir and the tracking flag char track CLIENT TRACKING state landing separately. |
WAIT |
Implemented | Single-node: returns immediately (no replicas to wait for) |
OBJECT HELP |
Implemented | |
BITFIELD_RO |
Implemented | GET-only; rejects SET/INCRBY/OVERFLOW |
SORT_RO |
Implemented | Rejects STORE |
GEORADIUS_RO |
Implemented | Rejects STORE/STOREDIST (the base GEORADIUS doesn't implement STORE either β translates to GEOSEARCH internally) |
GEORADIUSBYMEMBER_RO |
Implemented | Rejects STORE/STOREDIST (same STORE caveat as GEORADIUS_RO) |
FUNCTION * |
Implemented | FCALL/FUNCTION LOAD/DELETE/LIST/DUMP/FLUSH/STATS via the Lua sandbox |
Explicit Non-GoalsΒΆ
These commands are deliberately not implemented β not oversights:
| Command | Rationale |
|---|---|
PFDEBUG |
HyperLogLog internals-inspection command; no debugging surface to expose (Moon's HLL implementation isn't the dense/sparse Redis encoding this command introspects) |
PFSELFTEST |
Internal Redis HLL self-test with no external behavioral contract; nothing for a compatible server to reproduce |
FAILOVER |
Requires a primary/replica replication topology Moon doesn't have (single-node + cluster-mode sharding, no leader-initiated failover handshake) |
MODULE * |
Moon ships equivalent functionality (vector search, graph, JSON-like structures) as native compiled features rather than a dynamically loaded C module ABI |
SENTINEL * |
Moon's HA story is cluster mode + external orchestration (k8s/systemd), not Sentinel's gossip-based failover protocol |
Behavior DifferencesΒΆ
-
RESP3 Pub/Sub push messages β Moon uses RESP2 framing for pub/sub messages even when HELLO 3 is negotiated. Clients that strictly require RESP3 push framing for pub/sub may not work correctly.
-
Cluster mode β Available but not GA-hardened. Deferred to v0.2+.
-
Persistence format β Moon uses its own RDB format (magic
MOON, notREDIS). Redis RDB files cannot be loaded directly; use RESP-based migration (e.g.,redis-cli --rdb+ replay). -
Memory reporting β
INFO memorysections may report different field names than Redis 7.x. -
CONFIG GET/SET β Subset of Redis config parameters supported. Unrecognized parameters return empty rather than error.
Vector Search (RediSearch Subset)ΒΆ
| Command | Status |
|---|---|
FT.CREATE |
Implemented (HNSW, TurboQuant) |
FT.DROPINDEX |
Implemented |
FT.INFO |
Implemented |
FT.SEARCH |
Implemented (KNN, hybrid filter) |
FT.COMPACT |
Implemented |
FT.AGGREGATE |
Implemented (GROUPBY/REDUCE/SORTBY/LIMIT, scatter-gather across shards; APPLY is parsed but rejected at parse time as an explicit v1 stub, and a top-level FILTER clause is parsed but treated as a no-op β filtering happens via the query prefix instead) |
FT.ALTER |
Not implemented |
Last updated: 2026-07-10 β H-4 doc reconciliation: FT.AGGREGATE corrected from "Not implemented" to "Implemented". It is dispatched from src/command/vector_search/ft_aggregate.rs / src/text/aggregate.rs through a linear else-if chain in src/command/mod.rs and the sharded/monoio FT.* handlers (src/server/conn/handler_{single,sharded,monoio}/ft.rs) β reachable on both the read and write dispatch paths, single-shard and multi-shard. It intentionally has no entry in the phf COMMAND_META table in src/command/metadata.rs (a documented design choice β see the module doc comment atop ft_aggregate.rs), so COMMAND INFO FT.AGGREGATE / COMMAND DOCS FT.AGGREGATE return no metadata even though the command itself executes normally. Requires the text-index feature, which has been a default Cargo feature since v0.6.0.
Previously updated: 2026-07-08 β v0.6.0 WS1 command-parity audit (regenerated against src/command/metadata.rs; fixed stale WAIT/FUNCTION/ACL LOG/CLIENT LIST/OBJECT HELP claims, added BITFIELD_RO/SORT_RO/GEORADIUS_RO/GEORADIUSBYMEMBER_RO, documented explicit non-goals)