Docs Redis Protocol

Redis Protocol (RESP2)

Redis-compatible TCP server on port 6379 — 100+ commands across 5 data types, transactions, pub/sub, and persistence

Connection

# Connect with redis-cli (default port 6379)
redis-cli
# Or any Redis client library (ioredis, go-redis, jedis, etc.)
redis = Redis.new(host: "localhost", port: 6379)

Protocol Format

SoliKV speaks RESP2 (REdis Serialization Protocol), the same wire format used by Redis. Both array format and inline commands are supported.

Array format:    *3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
Inline format:   SET foo bar\r\n

Responses:
  Simple string:  +OK\r\n
  Error:          -ERR message\r\n
  Integer:        :42\r\n
  Bulk string:    $3\r\nbar\r\n
  Null:           $-1\r\n
  Array:          *2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n
100+
commands
5
data types
16
databases
MULTI
transactions
PUB/SUB
messaging

S Strings (16 commands)

CommandSyntaxDescription
SETSET key value [NX|XX] [GET] [EX s|PX ms]Set key with optional flags and TTL
GETGET keyGet value by key
SETNXSETNX key valueSet only if key does not exist
SETEXSETEX key seconds valueSet with expiry in seconds
PSETEXPSETEX key ms valueSet with expiry in milliseconds
GETSETGETSET key valueSet and return old value
MSETMSET key val [key val ...]Set multiple keys atomically
MSETNXMSETNX key val [key val ...]Set multiple keys only if none exist
MGETMGET key [key ...]Get multiple keys
APPENDAPPEND key valueAppend to string, returns new length
STRLENSTRLEN keyReturns string length
INCRINCR keyIncrement by 1, returns new value
DECRDECR keyDecrement by 1
INCRBYINCRBY key amountIncrement by integer amount
DECRBYDECRBY key amountDecrement by integer amount
INCRBYFLOATINCRBYFLOAT key amountIncrement by float amount

L Lists (13 commands)

Backed by a VecDeque — O(1) LPUSH/RPUSH/LPOP/RPOP at both ends.

CommandSyntaxDescription
LPUSHLPUSH key val [val ...]Push to head, returns length
RPUSHRPUSH key val [val ...]Push to tail, returns length
LPOPLPOP keyPop from head
RPOPRPOP keyPop from tail
LLENLLEN keyReturns list length
LRANGELRANGE key start stopGet range of elements
LINDEXLINDEX key indexGet element by index
LSETLSET key index valueSet element at index
LREMLREM key count valueRemove elements by value
LTRIMLTRIM key start stopTrim list to range
RPOPLPUSHRPOPLPUSH src dstPop tail of src, push to head of dst
LINSERTLINSERT key BEFORE|AFTER pivot valInsert before or after pivot
LPOSLPOS key valueFind index of value

H Hashes (11 commands)

CommandSyntaxDescription
HSETHSET key field val [field val ...]Set field(s), returns count of new fields
HGETHGET key fieldGet field value
HDELHDEL key field [field ...]Delete field(s)
HEXISTSHEXISTS key fieldCheck if field exists
HGETALLHGETALL keyGet all fields and values
HKEYSHKEYS keyGet all field names
HVALSHVALS keyGet all values
HLENHLEN keyReturns number of fields
HMSETHMSET key field val [field val ...]Set multiple fields
HMGETHMGET key field [field ...]Get multiple fields
HINCRBYHINCRBY key field amountIncrement field by integer

S Sets (10 commands)

CommandSyntaxDescription
SADDSADD key member [member ...]Add member(s), returns count added
SREMSREM key member [member ...]Remove member(s)
SMEMBERSSMEMBERS keyGet all members
SISMEMBERSISMEMBER key memberCheck membership
SCARDSCARD keyReturns set size
SPOPSPOP key [count]Remove and return random member(s)
SRANDMEMBERSRANDMEMBER key [count]Get random member(s) without removing
SUNIONSUNION key [key ...]Union of sets
SINTERSINTER key [key ...]Intersection of sets
SDIFFSDIFF key [key ...]Difference of sets

Z Sorted Sets (12 commands)

CommandSyntaxDescription
ZADDZADD key [NX|XX] [GT|LT] score member [...]Add members with scores
ZREMZREM key member [member ...]Remove member(s)
ZSCOREZSCORE key memberGet member score
ZRANKZRANK key memberGet rank (0-based, low to high)
ZREVRANKZREVRANK key memberGet rank (0-based, high to low)
ZRANGEZRANGE key start stop [WITHSCORES]Get range by rank
ZREVRANGEZREVRANGE key start stop [WITHSCORES]Get range by rank (reversed)
ZRANGEBYSCOREZRANGEBYSCORE key min max [LIMIT off cnt]Get range by score
ZCARDZCARD keyReturns sorted set size
ZCOUNTZCOUNT key min maxCount members in score range
ZINCRBYZINCRBY key increment memberIncrement member score
ZREMRANGEBYSCOREZREMRANGEBYSCORE key min maxRemove members by score range

K Keys (11 commands)

CommandSyntaxDescription
DELDEL key [key ...]Delete key(s), returns count deleted
EXISTSEXISTS key [key ...]Check existence, returns count
TYPETYPE keyReturns key type (string, list, hash, set, zset)
RENAMERENAME key newkeyRename key
RENAMENXRENAMENX key newkeyRename only if newkey does not exist
EXPIREEXPIRE key secondsSet TTL in seconds
PEXPIREPEXPIRE key msSet TTL in milliseconds
TTLTTL keyRemaining TTL in seconds
PTTLPTTL keyRemaining TTL in milliseconds
PERSISTPERSIST keyRemove TTL
KEYSKEYS patternFind keys matching pattern (*, prefix*, *suffix)

T Transactions (3 commands)

Queued commands execute atomically under a single write lock.

CommandSyntaxDescription
MULTIMULTIStart transaction
EXECEXECExecute queued commands
DISCARDDISCARDDiscard queued commands

P Pub/Sub (5 commands)

Uses DashMap + tokio::broadcast channels — pub/sub does not contend with data operations.

CommandSyntaxDescription
SUBSCRIBESUBSCRIBE channel [channel ...]Subscribe to channel(s)
UNSUBSCRIBEUNSUBSCRIBE [channel ...]Unsubscribe from channel(s)
PSUBSCRIBEPSUBSCRIBE pattern [pattern ...]Subscribe to pattern(s)
PUNSUBSCRIBEPUNSUBSCRIBE [pattern ...]Unsubscribe from pattern(s)
PUBLISHPUBLISH channel messagePublish message, returns receiver count

* Server (11 commands)

CommandSyntaxDescription
PINGPING [msg]Returns PONG or echoes argument
ECHOECHO messageEchoes message back
QUITQUITClose connection
SELECTSELECT dbSelect database (0-15)
DBSIZEDBSIZEReturns number of keys
FLUSHDBFLUSHDBDelete all keys in current db
FLUSHALLFLUSHALLDelete all keys in all databases
INFOINFO [section]Server information
COMMANDCOMMAND [DOCS|COUNT]Command metadata
CONFIGCONFIG GET patternGet configuration
TIMETIMEServer time [seconds, microseconds]

Examples

redis-cli -p 6379
# Strings
127.0.0.1:6379> SET user:1 Alice EX 3600
OK
127.0.0.1:6379> INCR page:views
(integer) 1
# Lists
127.0.0.1:6379> RPUSH queue job1 job2 job3
(integer) 3
127.0.0.1:6379> LPOP queue
"job1"
# Hashes
127.0.0.1:6379> HSET user:1 name Alice age 30
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "30"
# Sorted sets (leaderboard)
127.0.0.1:6379> ZADD leaderboard 100 alice 200 bob 150 charlie
(integer) 3
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) "alice"
2) "100"
3) "charlie"
4) "150"
5) "bob"
6) "200"
# Transactions
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET x 1
QUEUED
127.0.0.1:6379> SET y 2
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK

Pipeline Support

Full pipeline support with batch locking and write coalescing. Clients can send multiple commands without waiting for individual responses, achieving 1.6M+ SET/sec and 1.5M+ GET/sec with P=16.

Client Compatibility

redis-cli
ioredis (Node.js)
go-redis (Go)
redis-py (Python)
Jedis (Java)
redis-benchmark