RESP
RESP (протокол сериализации Redis) — это аббревиатура протокола сериализации Redis.Этот протокол представляет собой простой текстовый протокол с простым процессом реализации и хорошей производительностью синтаксического анализа.
5 типов юнитов
Протокол Redis делит передаваемую структуру данных на 5 наименьших типов единиц.В конце единицы равномерно добавляются символы возврата каретки и перевода строки \r\n.
1. Однострочная строка начинается со знака +
例:+hello world\r\n
2. Многострочная строка начинается со знака $, за которым следует длина строки.
例:$11\r\nhello world\r\n
Многострочные строки также могут использоваться для представления однострочных строк.
3. Целочисленные значения начинаются с символа :, за которым следует строковая форма целого числа.
例::1024\r\n
4. Сообщения об ошибках начинаются с символа -
ошибка типа параметра
例: -WRONGTYPE Operation against a key holding the wrong kind of value\r\n
5. Массив начинается с символа *, за которым следует длина массива.
例:*3\r\n:l\r\n:2\r\n:3\r\n
два специальных типа
1. NULL
NULL представлен многострочной строкой длиной -1.
例:$-1\r\n
2. Пустая строка
Пустая строка представлена многострочной строкой, а длина заполнена 0
例:$0\r\n\r\n
Пустая строка имеет два символа \r\n, потому что пробел между двумя символами \r\n является пустой строкой.
сервер клиентских запросов
Инструкции, отправляемые клиентом на сервер, имеют только один формат — массив многострочных строк.
Например, простой набор инструкций set x x будет сериализован в следующую строку
*3\r\n$3\r\nset\r\n$1\r\nx\r\n$1\r\nx\r\n
Консоль показывает следующее
*3
$3
set
$1
x
$1
x
Сервер отвечает клиенту
Когда сервер отвечает на информацию клиента, он будет использовать различные структуры данных, что намного сложнее, чем когда клиент отправляет их на сервер, но даже если это сложно, это комбинация пяти упомянутых основных типов. над.
однострочный строковый ответ
127 . 0 .0.1: 6379> set x x
OK
OK выше представляет собой однострочный ответ (без двойных кавычек), т.е. +OK
ответ об ошибке
127 . 0 . 0.1:6379> incr x
(error} ERR value is not an integer or out of range
Автоматически увеличивает строку, сервер выдает напоминание об ошибке
-ERR value is not an integer or out of range
Целочисленный ответ
127.0.0.1:6379> incr books
(integer} 1
1 — целочисленный ответ: 1
многострочный строковый ответ
127.0.0.1:6379> get x
"x"
X, заключенный в круглые скобки выше, представляет собой многострочный строковый ответ, то есть:
$1 x
ответ массива
127.0.0.1:6379> hset info name bibabo
(integer) 1
127.0.0.1:6379> hset info age 18
(integer) 1
127.0.0.1:6379> hset info sex male
(integer) 1
127.0.0.1:6379> hgetall info
1) "name"
2) "bibabo"
3) "age"
4) "18"
5) "sex"
6) "male"
Приведенная выше команда hgetall возвращает массив. 0-я, 2-я и 4-я строки — это ключи хэш-таблицы, а 1-я, 3-я и 6-я — значения. Клиент отвечает за сборку массива в словарь и его возврат .
*6
$4
name
$6
bibabo
$3
age
$2
18
$3
sex
$4
male
вложенный
127.0.0.1:6379> scan 0
1 )"0"
2) 1 ) "info"
2 )"books"
3 )"author"
Команда сканирования используется для сканирования всех списков ключей, содержащихся на сервере, и получения по частям в виде курсора.Команда возвращает вложенный массив.
Первое значение массива представляет собой значение курсора, если значение равно 0, это означает, что обход завершен, если не 0, использовать это значение в качестве параметра для следующего сканирования.
Второе значение массива — это другой массив, представляющий собой список ключей.
*2
$1
0
*3
$4
info
$5
books
$6
author
Узел
Redis как текстовый протокол содержит большое количество символов возврата каретки и перевода строки, которые будут занимать сетевой трафик, но все еще есть много проектов, использующих RESP в качестве протокола связи, потому что производительность — это еще не вся оценка, простота, понимание и простота реализации все необходимые сделать баланс,
В общем, узкое место базы данных редко находится в протоколе, а во внутренней логической обработке.Redis использует один поток для предоставления внешних сервисов.Когда ЦП заполнен, он может достигать QPS 10w/s.