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

Введение

Redis – это открытая система хранения данных в формате “ключ-значение” в оперативной памяти. Хранилище данных ключ-значение представляет собой тип базы данных NoSQL, в которой ключи служат уникальными идентификаторами для своих соответствующих значений. Каждый экземпляр Redis включает в себя несколько баз данных, каждая из которых может содержать множество ключей различных типов данных.

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

Как использовать это руководство

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

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

В качестве альтернативы вы можете предоставить экземпляр управляемой базы данных Redis для тестирования этих команд, но в зависимости от уровня контроля, предоставленного вашим поставщиком базы данных, некоторые команды из этого руководства могут не работать так, как описано. Чтобы предоставить управляемую базу данных DigitalOcean, следуйте нашей документации по продукту Управляемые базы данных. Затем вам необходимо либо установить Redli, либо настроить TLS-туннель для подключения к управляемой базе данных через TLS.

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

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

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

  1. select 15

Если вы выбрали базу данных отличную от 0, это отобразится в приглашении redis-cli:

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

  1. swapdb 6 8

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

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

  • Имя хоста или IP-адрес целевой базы данных
  • Номер порта целевой базы данных
  • Имя ключа, который вы хотите переместить
  • Номер базы данных, где вы хотите сохранить ключ в целевом экземпляре
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

Для иллюстрации вот пример:

  1. migrate 203.0.113.0 6379 key_1 7 8000

Кроме того, migrate позволяет использовать следующие параметры, которые вы можете добавить после аргумента timeout:

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

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

Существует ряд команд Redis, которые полезны для управления ключами независимо от типа данных, которые они содержат. Некоторые из этих команд рассматриваются в следующем разделе.

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

  1. rename old_key new_key

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

  1. randomkey
Output
"any_key"

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

  1. type key_1
Output
"string"

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

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

  1. move key_1 8

move вернет OK, если перемещение ключа прошло успешно.

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

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

  1. del key_1 key_2

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

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

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

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

  1. unlink key_1

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

Предупреждение: Следующие две команды считаются опасными. Команды flushdb и flushall будут необратимо удалять все ключи в одной базе данных и все ключи в каждой базе данных на сервере Redis, соответственно. Рекомендуется выполнять эти команды только в том случае, если вы абсолютно уверены, что хотите удалить все ключи в вашей базе данных или сервере.

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

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

  1. flushdb

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

  1. flushall

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

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

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

  1. save

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

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

  1. bgsave

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

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

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

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

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

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

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

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

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

  1. shutdown

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

  1. shutdown save

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

  1. shutdown nosave

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

  1. bgrewriteaof

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

Вывод

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

Для получения дополнительной информации о командах Redis, ознакомьтесь с нашей серией учебных пособий по Как управлять базой данных Redis.

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys