Управление базами данных и ключами Redis

Redis – это открытое in-memory хранилище данных типа «ключ-значение». Хранилище типа «ключ-значение» — это база данных NoSQL, где ключи служат уникальными идентификаторами связанных с ними значений. Экземпляр Redis включает в себя несколько баз данных, каждая из которых может содержать множество ключей разных типов данных. В этом мануале мы рассмотрим, как выбрать базу данных, перемещать ключи между базами, а также управлять ключами и удалять их.

Читайте также: Модели и системы управления базами данных NoSQL

Как работать с этим мануалом

Это руководство задумано как шпаргалка с примерами. Его не нужно выполнять последовательно – вы можете просто перейти к любому разделу, который имеет отношение к нужной вам задаче.

Команды, использованные в этом мануале, были протестированы на сервере Ubuntu 18.04 и экземпляре Redis версии 4.0.9. Чтобы настроить аналогичную среду, вы можете следовать разделу 1 руководства Установка и защита Redis в Ubuntu 18.04. Мы покажем, как эти ведут себя команды в redis-cli, интерфейсе командной строки Redis. Обратите внимание, что если вы используете другой интерфейс Redis — например, Redli – то вывод некоторых команд будет отличаться.

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

Экземпляр Redis «из коробки» поддерживает 16 логических баз данных. Эти базы данных фактически отделены друг от друга – то есть, когда вы запускаете команду в одной базе данных, это не влияет на данные, хранящиеся в других базах этого экземпляра Redis.

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

select 15

Если вы выбрали другую базу данных вместо 0, она будет отражена в префиксе строки redis-cli в квадратных скобках:

127.0.0.1:6379[15]˃

Чтобы заменить все данные, хранящиеся в одной базе данных, на данные, хранящиеся в другой, используйте команду swapdb. В следующем примере данные, хранящиеся в бд 6, будут заменены данными из бд 8, и все клиенты, подключенные к любой из этих баз, смогут сразу же увидеть изменения:

swapdb 6 8

swapdb вернет OK, если замена прошла успешно.

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

  • Имя хоста или IP-адрес целевой базы данных
  • Номер порта целевой базы данных
  • Ключ, который вы хотите перенести
  • Номер базы данных, в которой нужно сохранить ключ на целевом экземпляре
  • Интервал времени в миллисекундах, который определяет максимальное время простоя между двумя машинами. Обратите внимание: это не ограничение операции по времени (просто операция должна всегда обеспечивать определенный уровень прогресса в течение определенного периода времени).

Например:

migrate 203.0.113.0 6379 key_1 7 8000

Также команда migrate поддерживает несколько опций, которые можно указать после последнего аргумента:

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

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

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

Команда rename  переименует указанный ключ. Если операция выполнена успешно, она вернет ОК:

rename old_key new_key

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

randomkey
"any_key"

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

type key_1
"string"

Если указанный ключ не существует, type вернет none.

Вы можете переместить отдельный ключ в другую базу данных в вашем экземпляре Redis с помощью команды move. Команда move принимает в качестве аргументов ключ и имя базы данных, в которую нужно переместить ключ. Например, чтобы переместить ключ key_1 в базу данных 8, вы должны выполнить следующую команду:

move key_1 8

Команда move вернет ОК, если перемещение прошло успешно.

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

Чтобы удалить один или несколько ключей любого типа данных, используйте команду del, после которой укажите один или несколько ключей, которые нужно удалить:

del key_1 key_2

Если удаление ключей прошло успешно, команда вернет (integer) 1. В противном случае она вернет (integer) 0.

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

Однако если удаляемый ключ связан со многими объектами (например, если это хэш с тысячами или миллионами полей), блокировка будет неудобной. Удаление такого ключа может занять ощутимо много времени, и вам будет запрещено выполнять любые другие операции, пока ключ не будет полностью удален из памяти сервера.

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

unlink key_1

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

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

В ваших интересах переименовать эти команды – выберите имена, которые вряд ли запустите случайно. В мануале Установка и защита Redis в в Ubuntu 18.04 есть специальный раздел о переименовании команд.

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

flushdb

Чтобы удалить все ключи в каждой базе данных на сервере Redis (включая выбранную в данный момент базу), запустите flushall:

flushall

И flushdb, и flushall принимают опцию async, которая позволяет асинхронно удалять ключи в кластере. Это позволяет им функционировать аналогично команде unlink — они создают новый поток для постепенного освобождения памяти в фоновом режиме.

Резервное копирование базы данных Redis

Чтобы создать резервную копию выбранной базы данных, вы можете использовать команду save:

save

Это позволяет экспортировать снапшот текущего набора данных в виде файла .rdb, который представляет собой дамп базы данных и хранит данные во внутреннем сжатом формате сериализации.

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

bgsave

Обратите внимание: если клиенты добавляют или изменяют данные во время выполнения операции bgsave, эти изменения не будут зафиксированы в снапшоте.

Вы можете отредактировать конфигурационный файл Redis, чтобы Redis автоматически сохранял снапшот (этот режим называется snapshotting или RDB) – это делается через определенный интервал времени, если в базу данных было внесено минимальное количество изменений (это называется точка сохранения). Следующие настройки точки сохранения включены в файл redis.conf по умолчанию:

. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

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

Вы можете использовать команду shutdown для резервного копирования ваших данных Redis, после которого соединение будет закрыто. Эта команда заблокирует всех клиентов, подключенных к базе данных, а затем выполнит операцию сохранения, если настроена хотя бы одна точка сохранения. То есть она будет экспортировать базу данных в файл .rdb в ее текущем состоянии, не позволяя клиентам вносить какие-либо изменения.

Кроме того, команда shutdown сбрасывает изменения в файле только для записи перед выходом, если включить ее в режиме append-only. Режим append-only file (AOF) включает в себя создание лога каждой операции записи на сервере в файле .aof после каждого снапшота. Режимы AOF и RDB можно включить на одном сервере одновременно. Использование этих двух методов сохранения является эффективным способом резервного копирования ваших данных.

Команда shutdown по сути является блокирующей командой save, которая также сбрасывает все последние изменения в файл только для записи и закрывает соединение с экземпляром Redis:

shutdown

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

Опять же, в ваших интересах переименовать эту команду.

Если вы не настроили ни одной точки сохранения, но по-прежнему хотите, чтобы Redis выполнял операции сохранения, добавьте параметр save в команду shutdown:

shutdown save

Если вы настроили хотя бы одну точку сохранения, но хотите выключить сервер Redis, ничего не сохраняя, вы можете добавить в команду аргумент nosave:

shutdown nosave

Обратите внимание: файл только для записи может со временем стать очень длинным, но вы можете настроить Redis для перезаписи файла на основе определенных переменных. Для этого нужно отредактировать файл redis.conf. Вы также можете переписать файл только для записи, выполнив команду bgrewriteaof:

:
bgrewriteaof

Эта команда создаст кратчайший набор команд, необходимых для возврата базы данных в ее текущее состояние. Она будет работать в фоновом режиме. Однако если в фоновом режиме уже выполняется другая команда, Redis сможет выполнить bgrewriteaof только после того, как эта команда завершит работу.

Заключение

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

Читайте наш следующий мануал по Redis – о том, как работать со строками.

Tags: , , ,