Skip to main content

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

AreaSupport
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
Streamsfull 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

CommandStatusNotes
PING, ECHO, HELLO, RESET, AUTH, QUIT
SELECTDatabase 0 only
CLIENT SETNAME / GETNAME / ID / LIST / INFO
INFO, TIME, DBSIZE, COMMAND COUNT
CONFIG GET / CONFIG SETAccepted; 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

CommandStatus
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

CommandStatus
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

CommandStatus
HSET (single & multi), HSETNX, HGET, HMGET, HGETALL
HEXISTS, HDEL, HKEYS, HVALS, HLEN, HINCRBY
HSTRLEN, HINCRBYFLOAT, HRANDFIELD, HSCAN🚫
HEXPIRE, HTTL (per-field TTL)🚫

Lists

CommandStatus
RPUSH/LPUSH (single & multi), RPUSHX/LPUSHX
LLEN, LRANGE, LINDEX, LSET, LPOP/RPOP (+ count), LREM
LINSERT, LTRIM, RPOPLPUSH, LMOVE, LPOS, LMPOP🚫
BLPOP/BRPOP (blocking)🚫

Sets

CommandStatus
SADD, SREM, SMEMBERS, SISMEMBER, SCARD, SPOP (+ count), SRANDMEMBER (+ count)
SMISMEMBER, SSCAN🚫
SUNION/SINTER/SDIFF (+ …STORE), SMOVE, SINTERCARD🚫

Sorted sets

CommandStatus
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 ✅

CommandStatus
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

CommandStatus
PUBLISH, SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE
PUBSUB CHANNELS/NUMSUB/NUMPAT (introspection)🚫
SPUBLISH/SSUBSCRIBE (sharded)🚫

Transactions & distributed locks

CommandStatusNotes
MULTI / EXEC / DISCARD / WATCHQueueable 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:

FamilyStatusWhy
Lua scriptingEVAL, EVALSHA, SCRIPT LOAD🚫No embedded Lua engine
FunctionsFUNCTION, FCALL🚫
HyperLogLogPFADD, PFCOUNT, PFMERGE🚫
GeoGEOADD, GEOPOS, GEODIST, GEOSEARCH, GEORADIUS🚫
BitmapsSETBIT/GETBIT/BITCOUNT/BITPOS/BITOP/BITFIELD🚫
Cross-key set/zset algebra with …STORE🚫Multi-key commands must resolve within one slot
Blocking popsBLPOP, BRPOP, BZPOPMIN/MAX🚫
PersistenceSAVE, 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 …STORE commands 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