Введение
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
после подключения:
- select 15
Если вы выбрали базу данных отличную от 0
, это отобразится в приглашении redis-cli
:
-
Чтобы поменять все данные в одной базе данных на данные в другой, используйте команду swapdb
. В следующем примере данные в базе данных 6
будут заменены данными в базе данных 8
, и все подключенные к любой из баз данных клиенты смогут немедленно внести изменения:
- 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
Для иллюстрации вот пример:
- migrate 203.0.113.0 6379 key_1 7 8000
Кроме того, migrate
позволяет использовать следующие параметры, которые вы можете добавить после аргумента timeout:
COPY
: Указывает, что ключ не должен быть удален с исходного экземпляраREPLACE
: Указывает, что если ключ уже существует на месте назначения, операцияmigrate
должна удалить его и заменитьKEYS
: Вместо предоставления конкретного ключа для миграции вы можете ввести пустую строку (""
) и затем использовать синтаксис командыkeys
для миграции любого ключа, соответствующего шаблону. Дополнительные сведения о том, как работает командаkeys
, можно найти в нашем руководстве по Как устранить проблемы в Redis.
Управление ключами
Существует ряд команд Redis, которые полезны для управления ключами независимо от типа данных, которые они содержат. Некоторые из этих команд рассматриваются в следующем разделе.
rename
переименует указанный ключ. Если успешно, вернет OK
:
- rename old_key new_key
Вы можете использовать randomkey
для возврата случайного ключа из текущей выбранной базы данных:
- randomkey
Output"any_key"
Используйте type
, чтобы определить тип данных, хранящийся в указанном ключе. Вывод этой команды может быть либо string
, list
, hash
, set
, zset
или stream
:
- type key_1
Output"string"
Если указанный ключ не существует, то type
вернет вместо этого none
.
Вы можете переместить отдельный ключ в другую базу данных в вашем экземпляре Redis с помощью команды move
. move
принимает имя ключа и базу данных, в которую вы хотите переместить ключ, в качестве аргументов. Например, чтобы переместить ключ key_1
в базу данных 8
, вы бы запустили следующее:
- move key_1 8
move
вернет OK
, если перемещение ключа прошло успешно.
Удаление ключей
Чтобы удалить один или несколько ключей любого типа данных, используйте команду 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, соответственно. Рекомендуется выполнять эти команды только в том случае, если вы абсолютно уверены, что хотите удалить все ключи в вашей базе данных или сервере.
Может быть, в вашем интересе переименовать эти команды в что-то, что имеет меньшую вероятность случайного запуска.
Чтобы удалить все ключи в выбранной базе данных, используйте команду flushdb
:
- flushdb
Чтобы удалить все ключи в каждой базе данных на сервере Redis (включая текущую выбранную базу данных), выполните команду flushall
:
- flushall
И flushdb
, и flushall
принимают опцию async
, которая позволяет удалять все ключи в одной базе данных или в каждой базе данных в кластере асинхронно. Это позволяет им функционировать аналогично команде unlink
, и они создадут новый поток для пошагового освобождения памяти в фоновом режиме.
Резервное копирование вашей базы данных
Чтобы создать резервную копию текущей выбранной базы данных, вы можете использовать команду save
:
- save
Это экспортирует снимок текущего набора данных в файл .rdb
, который является файлом дампа базы данных, содержащим данный во внутреннем сжатом сериализованном формате.
save
` выполняется синхронно и блокирует любых других клиентов, подключенных к базе данных. Поэтому документация по команде save
рекомендует использовать эту команду практически никогда в производственной среде. Вместо этого рекомендуется использовать команду bgsave
. Это сообщает Redis создать форк базы данных: родительский процесс продолжит обслуживать клиентов, в то время как дочерний процесс сохранит базу данных перед выходом:
- bgsave
Обратите внимание, что если клиенты добавляют или изменяют данные во время выполнения операции bgsave
, эти изменения не будут учтены в снимке.
Вы также можете отредактировать файл конфигурации Redis, чтобы автоматически создавать снимок Redis (известный как снимок или режим RDB) после определенного времени, если минимальное количество изменений было внесено в базу данных. Это известно как точка сохранения. Следующие настройки точки сохранения включены по умолчанию в файле 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.
Фактически, может быть в вашем интересе переименовать эту команду в что-то с меньшей вероятностью случайного запуска.
- shutdown
Если вы не настроили точки сохранения, но все еще хотите, чтобы Redis выполнил операцию save
, добавьте параметр save
к команде shutdown
:
- shutdown save
Если у вас есть хотя бы одна точка сохранения настроенная, но вы хотите выключить сервер Redis без выполнения сохранения, вы можете добавить аргумент nosave
к команде:
- shutdown nosave
Обратите внимание, что файл только на дополнение может стать очень длинным со временем, но вы можете настроить Redis для перезаписи файла на основе определенных переменных, отредактировав файл redis.conf
. Вы также можете указать Redis переписать файл только для дополнения, выполнив команду bgrewriteaof
:
- bgrewriteaof
bgrewriteaof
создаст наименьший набор команд, необходимых для восстановления базы данных в ее текущее состояние. Как следует из названия этой команды, она будет выполняться в фоновом режиме. Однако, если другая команда на сохранение уже выполняется в фоновом режиме, эта команда должна завершиться, прежде чем Redis выполнит bgrewriteaof
.
Вывод
Это руководство подробно описывает ряд команд, используемых для управления базами данных и ключами. Если у вас есть другие связанные команды, аргументы или процедуры, о которых вы хотели бы узнать из этого руководства, пожалуйста, спросите или предложите в комментариях.
Для получения дополнительной информации о командах Redis, ознакомьтесь с нашей серией учебных пособий по Как управлять базой данных Redis.
Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys