Lightweight in-memory Redis implementation speaking the real RESP protocol.
Key
Value
Port
6379
Protocol
RESP (TCP)
Size
~50 KB
Startup
< 500ms
Default Connection
redis://parlel-bridge:6379
(Use localhost instead of parlel-bridge if you run the bridge outside Docker and publish its ports.)
No auth required. All commands accepted. AUTH is accepted as a no-op (the dev
pool does not enforce credentials).
Replies are framed in the real RESP protocol: nested arrays (SCAN,
SSCAN/HSCAN/ZSCAN, MGET, HMGET, GEOPOS, XRANGE) are encoded as RESP
arrays, missing entries come back as nil bulk ($-1), and typed errors use the
real error code (-WRONGTYPE …, -ERR value is not an integer or out of range,
-ERR no such key, -ERR unknown command …), so ioredis, node-redis, and
redis-py parse them unmodified.
messages are delivered to subscribers; single + multi channel; no PSUBSCRIBE/pattern matching
Transactions: MULTIEXECDISCARDWATCHUNWATCH
◐
accepted; commands are not queued/isolated
Bitmaps: SETBITGETBITBITCOUNTBITPOSBITOP
◐
BITOP/BITPOS simplified
HyperLogLog: PFADDPFCOUNTPFMERGE
◐
exact-set approximation (not probabilistic)
Streams: XADDXLENXRANGEXREVRANGEXREADXDEL
◐
simplified IDs (not strictly monotonic per ms)
Geo: GEOADDGEOPOSGEODISTGEORADIUS
◐
Euclidean approximation, not haversine
Scripting: EVALEVALSHA
✓
accepted, return nil (no Lua VM by design)
Auth / ACL credential enforcement
✓
accepted, not enforced (ephemeral in-memory dev pool)
Persistence (SAVE/BGSAVE/AOF)
✓
no-op — state is ephemeral by design
Clustering / replication
✓
single-node by design
Error codes & shapes
RESP errors carry the real error code as the first token, so client libraries
that branch on it behave the same as against production Redis:
Scenario
Reply
Type mismatch (e.g. GET on a list)
-WRONGTYPE Operation against a key holding the wrong kind of value
INCR/DECR/INCRBY/DECRBY on a non-integer value
-ERR value is not an integer or out of range
LSET/RENAME/RENAMENX on a missing key
-ERR no such key
Unknown command
-ERR unknown command '<NAME>'
Wrong argument count
-ERR wrong number of arguments for '<CMD>' command
Missing key (read)
nil bulk ($-1) — e.g. GET, HGET, LPOP, ZSCORE
Usage
Add the parlel/bridge sidecar to your test compose file. Your app connects to
the plain parlel-bridge hostname with unmodified real drivers — no Parlel
code in your app.
The decoded RESP reply is returned as { reply: ... }.
Seed Data
# cache-seed.txt
SET user:1 '{"id":1,"name":"Alice","email":"alice@test.com"}'
SET user:2 '{"id":2,"name":"Bob","email":"bob@test.com"}'
SET session:abc '{"userId":1,"role":"admin"}'
EXPIRE session:abc 3600
SET config:theme "dark"
SET config:lang "en"
Seed via MCP parlel_execute, or run these against the bridge with your normal client.
Access via Parlel Sandbox
The parlel/bridge sidecar (image: parlel/bridge) exposes Redis on
parlel-bridge:6379. It tunnels the raw RESP protocol as TCP over the sandbox's
HTTPS preview proxy via WebSocket, so redis-py, ioredis, or any client
connects to redis://parlel-bridge:6379 unmodified — with just an API key. No
SSH tunnel, no daytona CLI. (Use localhost instead of parlel-bridge if you
run the bridge outside Docker and publish its ports.) Postgres and Redis start
by default in a new sandbox.