Redis — это нереляционная (NoSQL) система управления базами данных. Платформа распространяется с открытым исходным кодом. Она хранит данные в памяти в виде комбинаций «ключ-значение», где первое значение является уникальным идентификатором для связанных с ним значений. Любой экземпляр Redis может содержать несколько БД, а каждая БД, в свою очередь, — большой объем различных типов данных.
Преимущества Redis:
SET
и до 81 000 GET
.cloud
В статье мы разберем несколько основных команд, используемых при управлении ключами и БД в Redis. Приведенные примеры в статье не связаны друг с другом и не требуют последовательного выполнения. Каждый из них можно рассматривать по отдельности.
Мы выполняем все описанные команды на сервере с системой Ubuntu 18.04 и Redis версии 4.0.9, используя утилиту redis-cli
. Однако их можно использовать и при работе с другими интерфейсами (Redli и др.), и при работе с облачными базами данных — совсем скоро на timeweb.cloud можно будет заказать облачную базу Redis, которая будет полностью готова к работе за несколько минут.
Но сначала чуть подробнее остановимся на типах, поддерживаемых системой данных. Основой для работы остаются ключи, представляющие собой двоичный код с максимальной длиной строки в 512 Мбайт. Остальные категории Redis поддерживает в качестве значений.
Строки — это простая последовательность байтов. Они никак не влияют на исполнение двоичного кода, поэтому данные в них не ограничивают какими-либо спецсимволами. Максимальный объем строки составляет 512 Мбайт, содержимое практически любое: текст, целые числа или с плавающей запятой, картинки, видео, другие медиафайлы.
Пример:
redis 127.0.0.1:6379> SET name "educative"
OK
redis 127.0.0.1:6379> GET name
"educative"
В нем name
— это непосредственно сам ключ, а educative
— строковое значение, которое пользователь планирует сохранить в базе данных.
Следующий по логике вариант – списки строк. Обычно элементы внутри списка хранятся в связи друг с другом, в отсортированном виде по порядку вставки в БД. Особенность Redis состоит в том, что скорость вставки 500 взаимосвязанных записей, объединенных в списки, и 50 000 таких же, не отличается. Это делает систему удобной для обработки больших и очень больших объемов данных.
Пример составления результирующих списков:
LPUSH mylist x # теперь лист - "x"
LPUSH mylist y # теперь лист - "y","x"
RPUSH mylist z # теперь лист - "y","x","z" (в этом случае использовался RPUSH)
Вариант предыдущей категории, единственное отличие заключается в отсутствии упорядоченности строк. База никак не сортирует их, не допускает появления дублей. Такой режим хранения полезен, когда требуется соблюсти уникальность информации, нельзя путать заданную последовательность (пусть и нелогичную на первый взгляд).
Пользователю доступен выбор варианта сортировки. Например, если оценка двух элементов будет одинакова, можно проверить, какая строка лексикографически больше, и разместить их согласно этому критерию. Технически к каждому сортируемому блоку привязывается определенное число, называемое счетом. За счет них и собираются «наборы».
Тип данных «хеш» – это пара значений конкретного поля. В них допускается хранить миллионы объектов при сохранении небольшого экземпляра самого хеша (в цифрах это значение достигает 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, с его удалением из исходника. Она содержит перечисленные ниже элементы в указанном порядке:
Например:
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 функционирует в фоне, но для ее выполнения требуется соблюсти условие – другие фоновые процессы должны быть полностью завершены.