Бесплатная миграция IT-инфраструктуры в облако

Как управлять ключами и базами данных Redis

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
15 декабря 2021 г.
4936
10 минут чтения
Средний рейтинг статьи: 5

Redis — это нереляционная (NoSQL) система управления базами данных. Платформа распространяется с открытым исходным кодом. Она хранит данные в памяти в виде комбинаций «ключ-значение», где первое значение является уникальным идентификатором для связанных с ним значений. Любой экземпляр Redis может содержать несколько БД, а каждая БД, в свою очередь, — большой объем различных типов данных.

Как Управлять Ключами И Базами Данных Redis

Преимущества Redis:

  1. Высокая скорость обработки. За одну секунду система способна «переварить» до 110 000 операций SET и до 81 000 GET.
  2. Поддержка расширенных типов данных. В БД, помимо строк, можно включать списки, наборы, включая отсортированные, хэши.
  3. Неделимость операций (принцип атомарности). Независимо от количества одновременно подаваемых запросов каждый клиент получает целостные данные.
  4. Универсальность платформы. Система Redis одинаково удобна при кэшировании, создании очередей обмена сообщениями, передачи краткосрочных блоков информации (например, во время веб-сессии).
  5. Простота настройки и использования. Это определяет популярность Redis при разработке на Python, PHP, Java и т.д.
cloud

В статье мы разберем несколько основных команд, используемых при управлении ключами и БД в Redis. Приведенные примеры в статье не связаны друг с другом и не требуют последовательного выполнения. Каждый из них можно рассматривать по отдельности.

Мы выполняем все описанные команды на сервере с системой Ubuntu 18.04 и Redis версии 4.0.9, используя утилиту redis-cli. Однако их можно использовать и при работе с другими интерфейсами (Redli и др.), и при работе с облачными базами данных — совсем скоро на timeweb.cloud можно будет заказать облачную базу Redis, которая будет полностью готова к работе за несколько минут.

Типы данных Redis

Но сначала чуть подробнее остановимся на типах, поддерживаемых системой данных. Основой для работы остаются ключи, представляющие собой двоичный код с максимальной длиной строки в 512 Мбайт. Остальные категории Redis поддерживает в качестве значений.

String

Строки — это простая последовательность байтов. Они никак не влияют на исполнение двоичного кода, поэтому данные в них не ограничивают какими-либо спецсимволами. Максимальный объем строки составляет 512 Мбайт, содержимое практически любое: текст, целые числа или с плавающей запятой, картинки, видео, другие медиафайлы.

Пример:

redis 127.0.0.1:6379> SET name "educative" 
OK 
redis 127.0.0.1:6379> GET name 
"educative"

В нем name — это непосредственно сам ключ, а educative — строковое значение, которое пользователь планирует сохранить в базе данных.

List

Следующий по логике вариант – списки строк. Обычно элементы внутри списка хранятся в связи друг с другом, в отсортированном виде по порядку вставки в БД. Особенность Redis состоит в том, что скорость вставки 500 взаимосвязанных записей, объединенных в списки, и 50 000 таких же, не отличается. Это делает систему удобной для обработки больших и очень больших объемов данных.

Пример составления результирующих списков:

LPUSH mylist x   # теперь лист - "x"
LPUSH mylist y   # теперь лист - "y","x"
RPUSH mylist z   # теперь лист - "y","x","z" (в этом случае использовался RPUSH)

Set

Вариант предыдущей категории, единственное отличие заключается в отсутствии упорядоченности строк. База никак не сортирует их, не допускает появления дублей. Такой режим хранения полезен, когда требуется соблюсти уникальность информации, нельзя путать заданную последовательность (пусть и нелогичную на первый взгляд).

Сортированные наборы

Пользователю доступен выбор варианта сортировки. Например, если оценка двух элементов будет одинакова, можно проверить, какая строка лексикографически больше, и разместить их согласно этому критерию. Технически к каждому сортируемому блоку привязывается определенное число, называемое счетом. За счет них и собираются «наборы».

Хеш

Тип данных «хеш» – это пара значений конкретного поля. В них допускается хранить миллионы объектов при сохранении небольшого экземпляра самого хеша (в цифрах это значение достигает 232). Такая особенность позволяет использовать всего одну БД независимо от количества аккаунтов, объема вносимых данных. Пример использования:

HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000

Управление базами данных

По умолчанию, без предварительной настройки, Redis содержит 16 баз данных, изолированных друг от друга. За счет изоляции вы можете спокойно запускать ту или иную команду для изменений в определенной базе, не переживая о том, что это как-то затронет данные за ее пределами. 

Базы данных имеют порядковые номера от 0 до 15, и по умолчанию вы подключитесь к базе номер 0. Изменить эту настройку можно через select, которую необходимо выполнить после коннекта. Например, выберем базу данных 10:

select 10

Выбранная база данных будет отображаться в консоли следующим образом:

127.0.0.1:6379[10]˃

Если специфическая БД не выбрана и вы работаете с базой 0, ее номер не будет отображаться дополнительно:

127.0.0.1:6379˃

Команда swapdb используется для копирования данных из одной БД в другую, с их полной заменой в соответствующих ячейках таблицы целевой базы. Например, ниже мы заменим значение из базы 1 информацией из базы 2:

swapdb 1 2

При успешном выполнении операции будет выведено OK. Изменения будут применены мгновенно.

Команда migrate используется для перемещения ключа между экземплярами Redis, с его удалением из исходника. Она содержит перечисленные ниже элементы в указанном порядке:

  • хост или IP-адрес БД, куда переносится информация;
  • номер порта новой базы;
  • название переносимого ключа;
  • номер базы от 0 до 15, где вы хотите сохранить его;
  • тайм-аут — максимальный период простоя в миллисекундах.

Например:

migrate 123.45.4.134 6379 key_1 6 8000

В конец команды, после перечисленных выше элементов, можно добавить одну из следующих опций:

  • COPY: отменит удаление ключа (тот копируется в целевую БД и одновременно сохранится в текущей);
  • REPLACE: при наличии нужного блока в целевом экземпляре, он удаляется и заменяется переносимым;
  • KEYS: позволит не указывать конкретный ключ в команде (а точнее, указать его в виде пустого значения ""), а затем после keys ввести определенный шаблон (см. описание в документации) и перенести весь объем данных, который ему соответствует. 

Управление ключами

Ниже приведем примеры нескольких основных команд Redis для работы с ключами.

Для переименования ключа используйте rename:

rename старое_имя_ключа новое_имя_ключа

Команда randomkey используется, чтобы вывести данные из базы случайным образом:

randomkey

В выводе будет отображен ключ.

Команда type позволяет вывести тип данных. В выводе будет указан один из возможных вариантов: string, list, hash, set, zset, stream, либо none — если такой ключ отсутствует в базе.

type имя_ключа

Команда move переместит ключ между БД внутри одного экземпляра Redis (в отличие от migrate, переносящей их в «другой» экземпляр Redis). В строку включают наименование ключа и целевого файла базы данных. Например, ниже мы передадим данные в базу 6:

move имя_ключа 6

При успешном выполнении операции будет выведено ОК.

Удаление ключей

Для удаления одного или нескольких ключей, используется del:

del имя_ключа_1 имя_ключа_2

При положительном результате будет выведено (integer) 1. Если что-то пошло не так, вы увидите (integer) 0.

Команда unlink функционально похожа на del, но имеет нюансы. Для освобождения памяти, занятой ключом, del временно заблокирует клиента. Если времени для этого требуется совсем мало (в случае, когда тот связан с небольшим объектом), факт блокировки, скорее всего, будет незаметным. Если же ключ связан с большим количеством объектов, то удаление будет идти достаточно долго, и в это время выполнение любых других операций будет невозможно.

В отличие от del, команда unlink предварительно оценит затраты на освобождение памяти, занятой ключом. Если они незначительные, unlink сработает так же, как del, временно заблокировав клиента. Если же освобождение памяти требует больших затрат, удаление будет происходить асинхронно: unlink работает в фоновом режиме и постепенно освобождает память без блокировки клиента:

unlink имя_ключа

В большинстве случаев предпочтительно использовать именно unlink, т.к. возможность асинхронного удаления ключей и меньшего числа ошибок из-за блокировок, является значительным преимуществом.

Для массового удаления ключей применяют одну из команд – flushdb и flushall.

Будьте очень внимательны, процедура происходит без возможности восстановления (применительно к одной или нескольким БД).

Для удаления всех ключей в текущей базе внесите:

flushdb

Чтобы убрать все ключи во всех БД на платформе Redis, используйте:

flushall

Обе команды имеют режим асинхронного удаления ключей, для этого добавляют опцию async. В этом случае они сработают так же, как unlink, с постепенной очисткой памяти на фоне других операций.

Резервное копирование

Для создания резервной копии текущей базы, можно применить:

save

В результате выполнения команды снапшот текущей информации экспортируется в файле .rdb

Важно учитывать, что save при выполнении блокирует все другие клиенты, обращающиеся к базе данных. Поэтому официальная документация рекомендует запускать команду save только в тестовой среде.

Вместо нее предлагается применять bgsave. Она сообщает Redis о необходимости создать форк БД: родительский процесс продолжит обслуживание клиентов, а дочерний выгрузит бэкап базы данных. Если в период обработки команды bgsave будут выполняться изменения, они не попадут в снапшот. 

bgsave

Также можно настроить автоматическое регулярное создание снапшотов, которое сработает при условии, что в базу было добавлено определенное количество изменений. Этим создается «точка сохранения». По умолчанию в файле конфигурации redis.conf указаны следующие настройки для точки сохранения:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

Согласно такой настройке, Redis выгрузит снапшот БД в файл, указанный в строке dbfilename с периодичностью 900 секунд, если изменился хотя бы 1 ключ; 300 секунд, если изменилось 10 ключей или более; каждые 60 секунд при изменении 10000 и более ключей.

Еще одна команды для создания бэкапа — shutdown. Она заблокирует каждый клиент, подключенный к базе, выполнит save и закроет соединение. Важно учитывать, что команда сработает аналогично save, а значит:

  • Снапшот будет создан, только если настроена точка сохранения.
  • При блокировке клиентов во время выполнения команды shutdown необходимые данные могут стать недоступны для пользователей или приложений. Ее стоит использовать только в тестовой среде и при полной уверенности, что вы можете без последствий заблокировать все клиенты сервера.
shutdown

Если точка сохранения не настроена, но вы хотите создать снапшот, добавьте save к команде:

shutdown save

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

shutdown nosave

Также команда shutdown обнуляет изменения в append-only файл (содержимое не меняется, а все новое добавляется в конец) перед отключением, если включена функция AOF (Append Only File, «только дополнение»). Он заполняет журнал по всем операциям записи на накопителях в файл .aof.

Подготовили для вас выгодные тарифы на облачные серверы

Режимы AOF и RDB могут быть включены одновременно и использование обоих методов это эффективный способ бэкапа. Append-only файл постепенно будет значительно разрастаться. Рекомендуется включить перезапись файла с учетом определенных переменных. Настройки необходимо указать внутри файла redis.conf.

Другим способом перезаписи append-only файла является выполнение команды:

bgrewriteaof

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

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
15 декабря 2021 г.
4936
10 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев