Redis RESP
RESP (REdis Serialization Protocol) — простой текстовый протокол Redis. Проектирован для быстроты парсинга. Порт 6379. Версии RESP2 и RESP3.
Типы данных RESP2
| Тип | Префикс | Пример |
|---|---|---|
| Simple String | + | +OK\r\n |
| Error | - | -ERR unknown\r\n |
| Integer | : | :42\r\n |
| Bulk String | $ | $5\r\nhello\r\n |
| Array | * | *2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n |
| Null | — | $-1\r\n или *-1\r\n |
Команда как массив bulk strings
# SET foo bar
*3\r\n
$3\r\nSET\r\n
$3\r\nfoo\r\n
$3\r\nbar\r\n
# ответ
+OK\r\n
Inline commands
# для telnet-debug
SET foo bar\r\n
+OK\r\n
Pipelining
Клиент шлёт много команд подряд, не ждёт ответов. Сервер отвечает в порядке. Огромный boost throughput на локальной сети.
# без pipeline: 100 команд × RTT(1мс) = 100мс
# с pipeline: все команды за 1 RTT + время сервера
RESP3 (Redis 6+)
Новые типы: Double (,), Boolean (#), Map (%), Set (~), Big Number ((), Verbatim String (=). Push-notification (>) для pubsub. Активируется через HELLO 3.
Pub/Sub
# subscriber
SUBSCRIBE news
# publisher (другое подключение)
PUBLISH news "hello"
# subscriber получает
*3
$7
message
$4
news
$5
hello
RESP + TLS
Redis 6+ поддерживает TLS. Клиент подключается сразу с TLS, RESP идёт поверх. Порт 6380.
Cluster mode
Redis Cluster — 16384 hash slots. Клиент получает MOVED/ASK-ответ если попал не на тот узел. RESP тот же, но клиенты должны понимать MOVED-редирект.
Реализации
- KeyDB — multithread форк
- Dragonfly — Rust
- Valkey — форк после лицензионного изменения Redis (2024)
- Kvrocks — RocksDB backend
- Alibaba Tair, Amazon MemoryDB, GCP Memorystore