Рубрики
Uncategorized

Анализ дампа команды redis

Автор оригинала: David Wong.

Виноград

Официальные документы

Ключ ДАМПА Сериализует данный ключ и возвращает сериализованное значение. Используйте команду восстановить, чтобы десериализовать значение в ключ redis. Значения, генерируемые сериализацией, имеют следующие характеристики:

  • Он имеет 64-разрядные контрольные суммы для обнаружения ошибок, и restore проверяет контрольные суммы перед десериализацией.
  • Формат кодирования значения соответствует файлу RDB.
  • Версия базы данных RDB будет закодирована в сериализованном значении. Если формат RDB несовместим из-за разных версий redis, redis откажется десериализовать значение.

Сериализованное значение не содержит никакой информации о сроке службы. Доступная версия:.6.0 Временная сложность: Сложность поиска данного ключа равна O (1), а сложность сериализации ключа равна O (n * m), где n-количество объектов redis, составляющих ключ, а M-средний размер этих объектов. Если сериализованный объект представляет собой небольшую строку, сложность равна O (1). Возвращаемое значение: Nil возвращается, если ключ не существует. В противном случае возвращается сериализованное значение.

redis> SET greeting "hello, dumping world!"
OK
redis> DUMP greeting
"\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
redis> DUMP not-exists-key
(nil)

Как мы видим, команда dump предназначена для сериализации данного ключа. Так что же такое сериализация? Давайте рассмотрим определение сериализации: сериализация-это процесс преобразования информации о состоянии объекта в форму, которая может быть сохранена или передана. Во время сериализации объект записывает свое текущее состояние во временное или постоянное хранилище. Позже вы можете воссоздать объект, прочитав или десериализовав его состояние из хранилища. Цель состоит в том, чтобы хранить объекты на разных платформах и передавать их по сети. Использование команды очень простое, то есть ключ сброса. Дамп обычно используется с восстановлением для сериализации и десериализации. Если вы хотите узнать больше о сериализации, мы рекомендуем прочитать: сериализацию легко понять.

Анализ исходного кода

Прежде всего, мы вставляем исходный код:

/* DUMP keyname
 * DUMP is actually not used by Redis Cluster but it is the obvious
 * complement of RESTORE and can be useful for different applications. */
void dumpCommand(client *c) {
    robj *o, *dumpobj;
    rio payload;
    /*Check if the key exists*/
    if ((o = lookupKeyRead(c->db,c->argv[1])) == NULL) {
    addReply(c,shared.nullbulk);
    return;
    }
    /*Create a dump payload*/
    createDumpPayload(&payload,o);
    /*Transfer to client*/
    dumpobj = createObject(OBJ_STRING,payload.io.buffer.ptr);
    addReplyBulk(c,dumpobj);
    decrRefCount(dumpobj);
    return;
}

Давайте проанализируем это медленно. Суть команды dump заключается в создании загрузки дампа, поэтому наша суть заключается в этом процессе. Сначала мы кратко опишем общий процесс: сначала проверьте, существует ли ключ, который мы хотим сериализовать, если да, создайте загрузку дампа, а затем передайте его клиенту.

  1. Проверка того, существует ли ключ, в основном реализуется с помощью lookupkeyread, что примерно означает проверку наличия ключа в базе данных redis с помощью ключа. Если он существует, он будет выполнен вниз, в противном случае информация будет отправлена клиенту. Обычно, когда мы сбрасываем несуществующий ключ, мы получаем ноль.
  2. Создайте загрузку дампа, которая является ядром команды дампа. Конкретный код реализации выглядит следующим образом:

    } Формат сгенерированного объекта сериализации выглядит следующим образом: +—–+——-+—–+ | Полезная нагрузка RDB | 2 байта Версия RDB | 8 байт CRC64 | +—–+——-+——-+

  3. Отправляйте информацию клиенту, последнюю часть информации, которую мы можем рассматривать как передачу сообщений, передавая последовательность полезной информации клиенту. Я напишу специальную тему, чтобы представить ее позже.

Если читателям интересно, пожалуйста, попробуйте GDB самостоятельно!!

Расширенное чтение

  • Сохраняемость базы данных RDB
  • Анализ большого и малого конца преобразования redis

Оригинал: “https://developpaper.com/analysis-of-dump-of-redis-command/”