Redis command compatibility
Zaris's Redis-protocol (RESP) front-end accepts ordinary Redis commands from any Redis client. It is a real RESP2 server, not a fork of Redis — the common command families work as a drop-in, and the rest are cleanly rejected with a normal Redis error (so your client raises an ordinary exception, never a hang or a wrong answer).
This page is the reference for which commands work. It is verified by pointing an unmodified StackExchange.Redis client at a Zaris node over a real socket and exercising the full client surface with permutations. Each row is one of two states:
- ✅ Supported — the command works.
- 🚫 Not supported — Zaris returns a clean Redis error (
unknown command/not supported/ mode-specific), and your client surfaces it as a normal error. Nothing silently misbehaves.
Porting application code command-by-command? Read Coming from Redis — it maps Redis commands to the equivalent native Zaris .NET API, several of which exist even where the RESP command is not yet wired.
At a glance
| Area | Support |
|---|---|
| Strings / keys / TTL | ✅ core get/set/expire; 🚫 ranges, bitmaps, OBJECT, SORT, DUMP/RESTORE |
| Hashes / Lists / Sets / Sorted sets | ✅ core add/get/remove/range; 🚫 scans, set-algebra *STORE, blocking pops, *BYLEX |
| Streams | ✅ full family (log, consumer groups, blocking reads) |
| Pub/Sub | ✅ publish / subscribe / psubscribe; 🚫 PUBSUB introspection, sharded pub/sub |
Transactions (MULTI/EXEC/WATCH) | ✅ with SET/GET/DEL/INCR/DECR |
Distributed lock (SET NX PX pattern) | ✅ take / query / release |
Connection / CLIENT / INFO / CONFIG | ✅ the common ones |
Scripting (Lua EVAL), Functions | 🚫 not supported |
| HyperLogLog, Geo, Bitmaps | 🚫 not supported |
Persistence (SAVE/BGSAVE), CLUSTER * | 🚫 not supported (no RDB/AOF; standalone-mode RESP) |
Connection & server
| Command | Status | Notes |
|---|---|---|
PING, ECHO, HELLO, RESET, AUTH, QUIT | ✅ | |
SELECT | ✅ | Database 0 only |
CLIENT SETNAME / GETNAME / ID / LIST / INFO | ✅ | |
INFO, TIME, DBSIZE, COMMAND COUNT | ✅ | |
CONFIG GET / CONFIG SET | ✅ | Accepted; a small config surface |
SCAN / KEYS (pattern) | ✅ | Cursor scan of the keyspace |
SAVE, BGSAVE, LASTSAVE, SLOWLOG | 🚫 | No RDB/AOF persistence |
FLUSHDB, FLUSHALL, SWAPDB | 🚫 | |
CLUSTER INFO / SLOTS / SHARDS | 🚫 | The RESP front-end runs standalone; use the failover models |
MEMORY USAGE | 🚫 |
Strings & bitmaps
| Command | Status |
|---|---|
SET (+ EX/PX/EXAT/PXAT/NX/XX/KEEPTTL), GET | ✅ |
MSET, MGET, GETSET, GETDEL, SETNX, SETEX/PSETEX | ✅ |
APPEND, STRLEN, INCR/INCRBY, DECR/DECRBY | ✅ |
INCRBYFLOAT | 🚫 |
GETEX, GETRANGE, SETRANGE, SUBSTR, LCS | 🚫 |
SETBIT, GETBIT, BITCOUNT, BITPOS, BITOP, BITFIELD (bitmaps) | 🚫 |
Keys / generic
| Command | Status |
|---|---|
EXISTS, TYPE, DEL, UNLINK | ✅ |
EXPIRE / PEXPIRE / EXPIREAT (+ NX/XX/GT/LT), TTL/PTTL, PERSIST | ✅ |
EXPIRETIME, RANDOMKEY, TOUCH | 🚫 |
RENAME, RENAMENX, COPY, MOVE | 🚫 |
DUMP, RESTORE, OBJECT, IDLETIME | 🚫 |
SORT, SORT … STORE, WAIT | 🚫 |
Hashes
| Command | Status |
|---|---|
HSET (single & multi), HSETNX, HGET, HMGET, HGETALL | ✅ |
HEXISTS, HDEL, HKEYS, HVALS, HLEN, HINCRBY | ✅ |
HSTRLEN, HINCRBYFLOAT, HRANDFIELD, HSCAN | 🚫 |
HEXPIRE, HTTL (per-field TTL) | 🚫 |
Lists
| Command | Status |
|---|---|
RPUSH/LPUSH (single & multi), RPUSHX/LPUSHX | ✅ |
LLEN, LRANGE, LINDEX, LSET, LPOP/RPOP (+ count), LREM | ✅ |
LINSERT, LTRIM, RPOPLPUSH, LMOVE, LPOS, LMPOP | 🚫 |
BLPOP/BRPOP (blocking) | 🚫 |
Sets
| Command | Status |
|---|---|
SADD, SREM, SMEMBERS, SISMEMBER, SCARD, SPOP (+ count), SRANDMEMBER (+ count) | ✅ |
SMISMEMBER, SSCAN | 🚫 |
SUNION/SINTER/SDIFF (+ …STORE), SMOVE, SINTERCARD | 🚫 |
Sorted sets
| Command | Status |
|---|---|
ZADD (+ NX/XX/GT/LT/CH/INCR), ZREM, ZSCORE, ZINCRBY | ✅ |
ZRANK/ZREVRANK, ZCARD, ZCOUNT, ZRANGE (by rank, WITHSCORES, order) | ✅ |
ZRANGEBYSCORE (+ WITHSCORES, Exclude, LIMIT) | ✅ |
ZMSCORE, ZLEXCOUNT, ZRANGEBYLEX, ZSCAN, ZRANDMEMBER | 🚫 |
ZPOPMIN/ZPOPMAX, ZMPOP, BZPOPMIN/BZPOPMAX (blocking) | 🚫 |
ZREMRANGEBYRANK/BYSCORE/BYLEX | 🚫 |
ZUNION/ZINTER/ZDIFF (+ …STORE), ZRANGESTORE | 🚫 |
Streams — full family ✅
| Command | Status |
|---|---|
XADD (+ MAXLEN), XLEN, XRANGE/XREVRANGE, XREAD, XTRIM, XDEL, XSETID | ✅ |
XGROUP CREATE/DESTROY/CREATECONSUMER/DELCONSUMER | ✅ |
XREADGROUP, XACK, XPENDING, XCLAIM, XAUTOCLAIM | ✅ |
XINFO STREAM/GROUPS/CONSUMERS | ✅ |
Pub/Sub
| Command | Status |
|---|---|
PUBLISH, SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE | ✅ |
PUBSUB CHANNELS/NUMSUB/NUMPAT (introspection) | 🚫 |
SPUBLISH/SSUBSCRIBE (sharded) | 🚫 |
Transactions & distributed locks
| Command | Status | Notes |
|---|---|---|
MULTI / EXEC / DISCARD / WATCH | ✅ | Queueable inside a transaction: SET, GET, DEL/UNLINK, INCR/INCRBY, DECR/DECRBY, PING, ECHO. Mapped onto Zaris's native 2-phase-commit transaction, so WATCH gives real optimistic-concurrency aborts. |
SET key val NX PX (distributed-lock take / query / release) | ✅ | The StackExchange.Redis LockTake/LockQuery/LockRelease helpers work. |
Not supported
These families return a clean Redis error — plan to use the native Zaris API, or keep Redis for them:
| Family | Status | Why |
|---|---|---|
Lua scripting — EVAL, EVALSHA, SCRIPT LOAD | 🚫 | No embedded Lua engine |
Functions — FUNCTION, FCALL | 🚫 | |
HyperLogLog — PFADD, PFCOUNT, PFMERGE | 🚫 | |
Geo — GEOADD, GEOPOS, GEODIST, GEOSEARCH, GEORADIUS | 🚫 | |
Bitmaps — SETBIT/GETBIT/BITCOUNT/BITPOS/BITOP/BITFIELD | 🚫 | |
Cross-key set/zset algebra with …STORE | 🚫 | Multi-key commands must resolve within one slot |
Blocking pops — BLPOP, BRPOP, BZPOPMIN/MAX | 🚫 | |
Persistence — SAVE, BGSAVE, RDB/AOF | 🚫 | Zaris durability is replication, not snapshot files |
Notes
- Whole-value model. Hashes, lists, sets, and sorted sets are stored and updated as a whole replicated value (read-modify-write CAS), which is why the core operations are supported but some in-place sub-commands and scans are not yet wired. See RESP gotchas.
- Two-hop proxy. Every RESP command is
client → node → key owner, so multi-key commands must land in one slot. This is the main reason cross-key…STOREcommands are unsupported. - This list grows. Support is added command-by-command; a 🚫 today may be ✅ in a later release. When in doubt, the native .NET API (see Coming from Redis) often already covers it.
See also
- Redis protocol (RESP) compatibility — enabling the front-end and the three failover models.
- Coming from Redis — Redis commands → native Zaris .NET API.