Thank you for reading this post, don't forget to subscribe!
1.Установка и настройка кластера redis
2.Защита Redis
3.Устранение неполадок в redis
4.Управление хэшами
5.Управление списками
6.Управление строками
7.Подключение к базе redis
8.Управление базами данных Redis
Redis – это открытое хранилище данных типа «ключ-значение». Redis поддерживает транзакции, pub/sub, автоматическое аварийное переключение и множество других функций.
Разработчики рекомендуют использовать Redis в среде производства Linux и OS X. Redis предоставляет множество клиентов, написанных на разных языках программирования; подробную информацию о клиентах можно найти на веб-сайте Redis.
В производственной среде репликация данных даже всего на две ноды считается полезным решением. Избыточность данных позволяет восстановить утраченную информацию в случае сбоя среды; это особенно важно при увеличении пользовательской базы приложения.
Данное руководство поможет настроить два сервера Redis: один ведущий (master) и один ведомый (slave). Также вы научитесь на время менять местами сервера master и slave.
Примечание: При помощи данных инструкций можно добавить в кластер больше серверов.
Данное руководство сосредоточено на создании кластера из двух серверов
1: Установка Redis
Установите Redis на сервер master. Для этого нужно включить репозиторий EPEL.
Примечание: EPEL (Extra Packages for Enterprise Linux) – это репозиторий, разработанный командой Fedora, который предоставляет качественные сторонние пакеты для дистрибутивов RHEL.
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
Если команда wget не сработала, возможно, она не установлена. Установите её:
yum install wget
После этого снова запустите:
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
После этого введите:
sudo rpm -ivh epel-release-7-5.noarch.rpm
Затем используйте команду:
sudo yum -y update
Выполнение этой команды может занять несколько минут. После этого можно установить Redis:
sudo yum install redis -y
После завершения установки запустите сервис Redis:
sudo systemctl start redis.service
Проверьте состояние хранилища:
sudo systemctl status redis.service
Команда вернёт:
1 2 3 4 5 6 7 8 |
redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Wed 2015-07-22 02:26:31 EDT; 13s ago Main PID: 18995 (redis-server) CGroup: /system.slice/redis.service └─18995 /usr/bin/redis-server 127.0.0.1:6379 |
Протестируйте установку Redis:
redis-cli ping
Команда должна вернуть:
PONG
Также проверить установку можно при помощи команды:
redis-benchmark -q -n 1000 -c 10 -P 5
Эта команда запустит redis-benchmark в тихом режиме (максимальное количество запросов – 1000, 10 одновременных подключений, передача 5 запросов).
Примечание: Чтобы получить подробную информацию о redis-benchmark, введите:
redis-benchmark --help
Запустите эталонный тест. После его завершения результат будет примерно таким:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PING_INLINE: 166666.67 requests per second PING_BULK: 249999.98 requests per second SET: 200000.00 requests per second GET: 200000.00 requests per second INCR: 200000.00 requests per second LPUSH: 200000.00 requests per second LPOP: 200000.00 requests per second SADD: 200000.00 requests per second SPOP: 249999.98 requests per second LPUSH (needed to benchmark LRANGE): 200000.00 requests per second LRANGE_100 (first 100 elements): 35714.29 requests per second LRANGE_300 (first 300 elements): 11111.11 requests per second LRANGE_500 (first 450 elements): 7194.24 requests per second LRANGE_600 (first 600 elements): 5050.50 requests per second MSET (10 keys): 100000.00 requests per second |
После этого перейдите на сервер slave и повторите все вышеперечисленные действия.
Примечание: Если в вашем кластере больше серверов, повторите этот раздел на всех серверах.
Итак, хранилище Redis установлено и запущено на двух нодах. Если вывод на любой из нод отличается от приведённого выше вывода, внимательно повторите инструкции по установке и убедитесь, что все требования соблюдены.
2: Настройка ведущего сервера (Redis Master)
Итак, у вас есть кластер Redis из двух нод. Теперь нужно отредактировать их конфигурационные файлы. Между настройками ведущего и ведомого сервера существуют небольшие различия.
Для начала настройте сервер master.
Откройте в текстовом редакторе файл /etc/redis.conf:
sudo vi /etc/redis.conf
Отредактируйте в нём следующие строки.
Установите новое значение таймера keepalive для TCP:
tcp-keepalive 60
Откройте доступ к серверу в сети, раскомментировав следующую строку:
#bind 127.0.0.1
Учитывая особенности Redis (в частности, высокую скорость работы хранилища), злоумышленник может очень быстро выполнить успешную brute force атаку и получить пароль доступа. Поэтому рекомендуется раскомментировать строку requirepass и указать в ней сложный пароль.
requirepass your_redis_master_password
Следующую строку нужно отредактировать в зависимости от целей использования сервера. Предположим, ключи не буду удаляться из кластера; тогда нужно раскомментировать строку и установить такое значение:
maxmemory-policy noeviction
После этого нужно настроить резервное копирование данных. Раскомментируйте следующие строи и задайте им новые значения:
appendonly yes
appendfilename "appendonly.aof"
Сохраните изменения.
Перезапустите сервис Redis:
sudo systemctl restart redis.service
3: Настройка ведомого сервера (Redis Slave)
Теперь нужно настроить сервер slave. Откройте /etc/redis.conf в текстовом редакторе:
sudo vi /etc/redis.conf
Некоторые параметры будут совпадать с сервером master.
Откройте доступ к серверу в сети; для этого нужно раскомментировать строку:
#bind 127.0.0.1
Серверу slave также необходим пароль. Раскомментируйте следующую строку и введите надёжный пароль:
requirepass your_redis_slave_password
Затем раскомментируйте следующую строку и укажите IP-адрес сервера master и порт (по молчанию – порт 6379):
slaveof your_redis_master_ip 6379
Раскомментируйте masterauth и укажите пароль сервера master.
masterauth your_redis_master_password
Сохраните и закройте файл. Перезапустите сервис:
sudo systemctl restart redis.service
Эта команда перезапустит Redis с новыми настройками.
Подключитесь к серверу Redis:
redis-cli -h 127.0.0.1 -p 6379
Авторизуйтесь при помощи пароля сервера slave.
AUTH your_redis_slave_password
Итак, теперь машины master и slave кластера Redis настроены.
4: Репликация данных
Чтобы лучше понять поведение кластера Redis, протестируйте его работу. Проверьте взаимодействие серверов Redis.
На сервере master подключитесь к Redis в терминале.
Сначала подключитесь к локальной копии на порт 6379.
Примечание: Если вы изменили стандартный порт, укажите новый номер порта.
redis-cli -h 127.0.0.1 -p 6379
Укажите пароль Redis:
AUTH your_redis_master_password
Команда должна вернуть:
OK
После этого нужно запустить:
INFO
Эта команда предоставит все данные о master-сервере Redis. Особенно важен сейчас раздел #Replication. Он должен выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 |
. . . # Replication role:master connected_slaves:1 slave0:ip=111.111.111.222,port=6379,state=online,offset=407,lag=1 master_repl_offset:407 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:406 . . . |
Обратите внимание на строку connected_slaves:1, которая значит, что ведомый сервер взаимодействует с сервером master. Также здесь можно найти IP-адрес, порт, состояние, и много других сведений о сервере.
Теперь просмотрите раздел #Replication на машине slave. Подключитесь к этому серверу и выполните команду INFO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
. . . # Replication role:slave master_host:111.111.111.111 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:1401 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . . |
Как видите, здесь отмечено, что данная машина исполняет роль ведомой и не имеет подчинённых ей машин.
5: Настройка аварийного переключения
Любой сервер slave можно повысить до статуса master. Такая архитектура кластера позволяет обрабатывать сбои, обеспечивая целостность данных и наименьшее время простоя.
Попробуйте выполнить такую настройку вручную.
На сервере slave подключитесь к Redis:
redis-cli -h 127.0.0.1 -p 6379
Авторизуйтесь, указав пароль:
AUTH your_redis_slave_password
Отключите поведение slave:
SLAVEOF NO ONE
Команда ответит:
OK
После этого введите:
INFO
Найдите раздел # Replication:
1 2 3 4 5 6 7 8 9 10 |
. . . # Replication role:master connected_slaves:0 master_repl_offset:1737 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 . . . |
Как и ожидалось, slave-сервер стал сервером master и теперь может принимать соединения от других машин. Его можно использовать в качестве ведущего сервера на время устранения ошибок на предыдущем сервере master.
Если в кластере есть несколько slave-серверов, после изменения master-сервера нужно соединить их с новым сервером.
Для этого можно создать скрипт, который в случае сбоя сервера master внесёт соответствующие поправки в настройки:
- Перенаправит все запросы на сервер slave.
- Выполнит на этом сервере команду SLAVEOF NO ONE. Начиная с версии Redis 1.0.0, эта команда отключает репликацию данных на сервере slave и запускает его в качестве ведущего сервера.
- Переподключит все существующие серверы slave (SLAVEOF hostname port) к новому master-серверу. Значения hostname и port нужно заменить именем хоста и портом нового master-сервера.
- Устранив неполадки на старом сервере master, можно восстановить его статус.
Существует множество средств для обеспечения такого поведения кластера.
Выберите наиболее подходящее для вашей среды решение и тщательно протестируйте его, прежде чем возникнут какие-либо сбои.
6: Восстановление статуса master
Теперь старый master-сервер стал сервером slave. Чтобы восстановить старый сервер master, войдите на текущий сервер master, запустите Redis и введите следующую команду:
SLAVEOF your_redis_master_ip 6379
Если теперь снова запустить команду INFO, вы увидите, что настройки вернулись в исходное состояние.
2.Защита Redis
Эффективный способ защитить Redis – защитить сервер, на котором он работает. Вы можете сделать это, привязав Redis к локальному хосту или к внутреннему IP-адресу и настроив брандмауэр.
Однако если вы хотите настроить кластер Redis, вам нужно будет разрешить внешние подключения, что не так безопасно, как привязка к локальному хосту или внутреннему IP-адресу.
Откройте файл Redis:
sudo vi /etc/redis.conf
Найдите строку bind и убедитесь, что она раскоментирована:
bind 127.0.0.1
Если вам нужно связать Redis с другим IP-адресом (например, если вы будете обращаться к Redis с отдельного хоста), настоятельно рекомендуем вам привязать его к внутреннему IP-адресу. Привязка к внешнему IP-адресу подвергает интерфейс Redis постороннему воздействию.
bind your_private_ip
Если вы выполнили предварительные требования к мануалу и установили firewalld на свой сервер, и вы не планируете подключаться к Redis с другого хоста, вам не нужно добавлять дополнительные правила брандмауэра для Redis. В конце концов, любой входящий трафик по умолчанию будет сброшен, если его явно не разрешают правила брандмауэра. Поскольку автономная установка сервера Redis по умолчанию прослушивает только интерфейс loopback (127.0.0.1 или localhost), вы можете не переживать по поводу входящего трафика на порт по умолчанию.
Если, однако, вы планируете получать доступ к Redis с другого хоста, вам нужно внести некоторые изменения в конфигурацию firewalld, используя команду firewall-cmd. Опять же, вы должны разрешать доступ к серверу Redis, используя внутренние IP-адреса клиентов, чтобы ограничить количество хостов, у которых есть доступ к сервису.
Добавьте выделенную зону Redis в брандмауэр firewalld:
sudo firewall-cmd --permanent --new-zone=redis
Затем укажите, какой порт вы хотите открыть. Redis использует порт 6397 по умолчанию:
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
Затем укажите внутренние IP-адреса, которые могут пройти брандмауэр и получить доступ к Redis:
sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
Затем перезапустите брандмауэр, чтобы обновить правила:
sudo firewall-cmd --reload
Когда брандмауэр увидит пакет с IP-адреса клиента, он применит к этому соединению правила в выделенной зоне Redis. Все остальные соединения будут обрабатываться в зоне по умолчанию public. Сервисы в зоне по умолчанию применяются к каждому соединению, а не только к тем, которые не соответствуют другим зонам, поэтому вам не нужно добавлять другие службы (например, SSH) в зону Redis – эти правила будут применяться к соединению автоматически.
Если вы используете брандмауэр Iptables, вам необходимо предоставить клиентам доступ к порту Redis, для чего нужны следующие команды:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP
Обязательно сохраните правила брандмауэра Iptables с помощью механизма, предоставляемого вашим дистрибутивом.
Для защиты Redis подойдет любой брандмауэр. Важно, чтобы брандмауэр работал и защищал сервер от посторонних пользователей.
Настройка пароля Redis
Если у вашего кластера уже есть пароль, в этом разделе вы узнаете, как сделать его более надежным.
Настраивая пароль, вы включаете одну из встроенных функций Redis – команду auth, которая требует у клиента пройти аутентификацию, прежде чем открыть ему доступ к БД. Как и параметр bind, паоль настраивается в конфигурационном файле /etc/redis.conf.
sudo vi /etc/redis.conf
Найдите раздел SECURITY и найдите закомментированную директиву:
# requirepass foobared
Раскомментируйте ее, удалив #, и укажите здесь надежный пароль (желательно выбрать посложнее). Вместо того чтобы самостоятельно придумывать пароль, вы можете использовать такой инструмент, как apg или pwgen. Если вы не хотите устанавливать приложение только для того, чтобы сгенерировать один пароль, вы можете использовать приведенную ниже команду.
Обратите внимание, при каждом запуске эта команда будет генерировать один и тот же пароль. Чтобы создать другой пароль, измените слово в кавычках.
echo "help-me" | sha256sum
Сгенерированный пароль будет выражен последовательностью символов, которую сложно запомнить, но такой пароль очень надежен и он достаточно длинный, что важно для Redis. Скопируйте пароль из вывода этой команды и вставьте его в качестве нового значения requirepass:
requirepass password_copied_from_output
Если вы предпочитаете более короткие пароли, используйте вместо этого следующую команду. Снова измените слово в кавычках, чтобы она не генерировала тот же пароль.
echo "help-me" | sha1sum
Установив пароль, сохраните и закройте файл.
Перезапустите Redis:
sudo systemctl restart redis.service
Чтобы проверить, работает ли пароль, перейдите в командную строку Redis:
redis-cli
Чтобы проверить работоспособность пароля Redis, используйте такую последовательность команд. Первая команда пытается присвоить значению без аутентификации.
set key1 10
Она не сработает, так как для выполнения операции нужен пароль.
(error) NOAUTH Authentication required.
Следующая команда проходит аутентификацию с паролем, указанным в файле конфигурации Redis.
auth your_redis_password
Redis подтверждает, что вы прошли аутентификацию:
OK
После этого повторите предыдущую команду, теперь операция будет выполнена успешно:
set key1 10
OK
Эта команда извлечет значение нового ключа:
get key1
"10"
Эта команда закроет redis-cli:
quit
Можно также использовать exit.
Теперь будет очень трудно получить несанкционированный доступ к Redis. Обратите внимание, что без SSL или VPN посторонние пользователи могут перехватить незашифрованный пароль, если вы подключаетесь к Redis удаленно.
Переименование команд
Еще одна встроенная функция безопасности Redis позволяет вам переименовывать или полностью отключать определенные команды, которые считаются опасными. Злоумышленники могут использовать такие команды для перенастройки, уничтожения или повреждения данных. Вот краткий список опасных команд:
- FLUSHDB
- FLUSHALL
- KEYS
- PEXPIRE
- DEL
- CONFIG
- SHUTDOWN
- BGREWRITEAOF
- BGSAVE
- SAVE
- SPOP
- SREM RENAME DEBUG
Это не полный список, но для начала достаточно будет переименовать или отключить все команды в этом списке.
Отключать или переименовывать команду – это зависит от конкретной ситуации. Если вы знаете, что никогда не будете использовать опасную команду, вы можете ее отключить. В противном случае вы должны переименовать ее.
Как и пароль, переименование или отключение команд настраивается в разделе SECURITY файла /etc/redis.conf. Откройте файл:
sudo vi /etc/redis.conf
Важно! Далее в мануале приведены общие примеры. Вы должны отключить или переименовать команды, которые важны в вашей конкретной ситуации. Вы можете узнать больше о вредоносном использовании команд на redis.io/commands.
Чтобы отключить команду, просто переименуйте ее в пустую строку, как показано ниже:
1 2 3 4 5 6 |
# It is also possible to completely kill a command by renaming it into # an empty string: # rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" |
Чтобы переименовать команду, дайте ей другое имя, как в приведенных ниже примерах. Переименованные команды другим пользователям должно быть трудно угадать, а вам – легко запомнить.
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
Сохраните и закройте файл. Перезапустите Redis:
sudo service redis-server restart
Чтобы проверить новую команду, откройте командную строку Redis:
redis-cli
Пройдите аутентификацию, используя пароль, который вы определили ранее:
auth your_redis_password
OK
Предположим, что вы переименовали команду CONFIG в ASC12_CONFIG; в таком случае попытка запустить команду config должна завершиться ошибкой.
config get requirepass
(error) ERR unknown command 'config'
Теперь сработает переименованная команда:
asc12_config get requirepass
1) "requirepass"
2) "your_redis_password"
Закройте redis-cli:
exit
Обратите внимание, если вы перезагружаете Redis, не закрыв перед этим командную строку, вам необходимо повторно пройти аутентификацию. В противном случае вы получите эту ошибку:
NOAUTH Authentication required.
Важно! Что касается переименования команд, в конце раздела SECURITY в файле /etc/redis.conf содержится предостерегающее заявление:
Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.
Это означает, что если переименованная команда не находится в файле AOF или этот файл не был передан slave машинам, тогда проблем не должно быть. Помните об этом при переименовании команд. Лучшее время для переименования команды – это сразу после установки или когда вы не используете AOF (то есть перед развертыванием приложения, использующего Redis).
Если вы используете AOF в установке master-slave, GitHub советует вот что:
Команды регистрируются в AOF и реплицируются на slave так же, как отправляются; поэтому если вы попытаетесь воспроизвести AOF на экземпляре, который не поддерживает таких же переименованных команд, вы можете столкнуться с конфликтом.
Лучший способ избежать проблем с переименованием в таких случаях – убедиться, что переименованные команды применяются ко всем экземплярам установки master-slave.
Права на файлы и каталог данных
На этом этапе нужно изменить права собственности и доступа к файлам, чтобы улучшить профиль безопасности установки Redis. Подразумевается, что право на чтение файлов есть только у пользователя, которому такой доступ необходим для работы. Этот пользователь по умолчанию – redis.
Чтобы проверить это, используйте grep:
ls -l /var/lib | grep redis
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
Вы увидите, что каталог данных Redis принадлежит пользователю redis и группе redis. Такие права собственности безопасны, но права доступа к каталогу (755) – нет. Чтобы только пользователь Redis имел доступ к папке и ее содержимому, измените права доступа на 770:
sudo chmod 770 /var/lib/redis
Также нужно изменить права доступа к конфигурационному файлу. По умолчанию это 644, файл принадлежит пользователю и группе root:
ls -l /etc/redis.conf
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf
Такие права доступа (644) позволяют всем пользователям читать файл. Это очень рискованно, так как файл конфигурации содержит незашифрованный пароль, который вы настроили в разделе 4. Вам необходимо изменить права собственности и права доступа к файлу конфигурации. В идеале, он должен принадлежать пользователю redis и группе redis. Для этого запустите следующую команду:
sudo chown redis:redis /etc/redis.conf
Теперь передайте все права на чтение и запись владельцу файла:
sudo chmod 660 /etc/redis.conf
Проверить права может эта команда:
ls -l /etc/redis.conf
total 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
Перезапустите Redis:
sudo service redis-server restart
3.Устранение ошибок, связанных с памятью
Команда memory usage говорит, сколько памяти в настоящее время используется одним ключом. Она принимает имя ключа в качестве аргумента и выводит количество байтов, которые он использует:
memory usage key_meaningOfLife
(integer) 42
Для более общей картины использования памяти сервером Redis вы можете выполнить команду memory stats:
memory stats
Эта команда выводит массив связанных с памятью метрик и их значений. Ниже приведены показатели, которые выводит команда memory stats:
- peak.allocated: максимальное количество байтов, потребляемых Redis.
- total.allocated: общее количество байтов, выделенных Redis.
- startup.allocated: начальное количество байтов, использованных Redis при запуске.
- replication.backlog: размер лога репликации в байтах.
- client.slaves: общий размер всех издержек реплики (буферы вывода и запросов и контексты соединения).
- clients.normal: общий размер всех накладных расходов клиента.
- aof.buffer: общий размер текущих и перезаписываемых буферов только для записи.
- db.0: издержки словарей main и expiry для каждой базы данных, используемой на сервере, в байтах.
- overhead.total: сумма всех издержек, используемых для управления пространством ключей Redis.
- keys.count: общее количество ключей во всех базах данных на сервере.
- keys.bytes-per-key: соотношение использования памяти сервера и количества ключей из keys.count.
- dataset.bytes: размер набора данных в байтах
- dataset.percentage: процент использования чистой памяти Redis, занятый dataset.bytes.
- peak.percentage: процент значения peak.allocated в общем объеме total.allocated.
- fragmentation: отношение объема используемой в данный момент памяти к физической памяти, используемой Redis.
Команда memory malloc-stats предоставляет внутренний статистический отчет от jemalloc, распределителя памяти Redis в системах Linux:
memory malloc-stats
Если кажется, что ваши проблемы связаны с памятью, но анализ выходных данных предыдущих команд ничего полезного не говорит, вы можете попробовать запустить команду memory doctor:
memory doctor
Эта функция выводит все проблемы, связанные с использованием памяти, которые она может найти, и предлагает возможные решения.
Сбор общей информации об экземпляре Redis
Команда monitor – это команда отладки, которая не связана напрямую с управлением памятью. Она позволяет посмотреть на постоянный поток каждой команды, обрабатываемой сервером Redis:
monitor
OK
1566157213.896437 [0 127.0.0.1:47740] "auth" "foobared"
1566157215.870306 [0 127.0.0.1:47740] "set" "key_1" "878"
Еще одна полезная для отладки команда – это info, она возвращает несколько блоков информации и статистики о сервере:
info
# Server
redis_version:4.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9435c3c2879311f3
redis_mode:standalone
os:Linux 4.15.0-52-generic x86_64
. . .
Эта команда возвращает много данных. Если вы хотите увидеть только один конкретный блок, вы можете указать его в качестве аргумента команды info:
info CPU
# CPU
used_cpu_sys:173.16
used_cpu_user:70.89
used_cpu_sys_children:0.01
used_cpu_user_children:0.04
Обратите внимание: вывод команды info будет зависеть от того, какую версию Redis вы используете.
Использование команд keys
Команда keys полезна в тех случаях, когда вы забыли название ключа или, возможно, создали его, но случайно ошиблись в названии ключа. Команда keys ищет ключи, которые соответствуют шаблону:
keys pattern
Команда поддерживает следующие глобальные переменные:
- ? – подстановочный знак для одного символа. Например, шаблон s?mmy соответствует ключам sammy, sommy и sqmmy.
- – это подстановочный знак для любого количества символов (включая 0 символов). Например, шаблон sa*y совпадет с ключами sammy, say, sammmmmmy и salmony.
- Вы можете указать два или более символов, которые может включать шаблон, в квадратных скобках. То есть, шаблон s[ai]mmy совпадет с результатами sammy и simmy, но не с summy.
- Чтобы игнорировать одну или несколько букв, заключите их в квадратные скобки и поставьте перед ними символ ^. Например, шаблон s[^oi]mmy совпадет с ключом sammy или sxmmy, но не с sommy или simmy.
- Чтобы задать диапазон букв, укажите первую и последнюю букву диапазона и возьмите их в квадратные скобки. Шаблон s[a-o]mmy соответствует ключам sammy, skmmy или sommy, но не соответствует ключу srmmy
Важно! Документация Redis рекомендует использовать команду keys в производственной среде только в исключительных случаях, так как она может оказать существенное негативное влияние на производительность.
4. Управление хэшами
Чтобы создать хэш, запустите команду hset. Эта команда принимает в качестве аргументов ключ, поле и соответствующую строку значения:
hset poet:Verlaine nationality French
Примечание: В этом и следующих примерах poet:Verlaine – ключ хэеша. Точки, тире и двоеточия обычно используются, чтобы сделать многословные ключи и поля более читабельными. Для записи ключей принято последовательно использовать легко читаемый формат.
Команда hset возвращает (integer) 1, если указанное поле добавлено и значение установлено правильно:
(integer) 1
Однако если вы неправильно указали значение, поле или имя ключа хэша, hset вернет ошибку.
Также обратите внимание, что hset перезапишет содержимое хэша, если такой хэш уже существует:
hset poet:Verlaine nationality Francais
Если поле уже существует и его значение было успешно обновлено, hset вернет:
(integer) 0
Вы также можете использовать hsetnx для добавления полей в хэши, но эта команда сработает только в том случае, если поле еще не существует. Если указанное поле уже существует, hsetnx ничего не сделает и вернет (integer) 0:
hsetnx poet:Verlaine nationality French
(integer) 0
Чтобы установить несколько пар «поле/значение» для данного набора, используйте команду hmset, за которой укажите необходимые строки «поле/значение»:
hmset poet:Verlaine born 1844 died 1896 genre Decadent
Команда hmset вернет OK, если все прошло успешно.
Извлечение информации из хэшей
С помощью команды hexists можно определить, существует ли поле в данном хэше:
hexists poet:Verlaine nationality
Команда hexists вернет (integer) 1, если поле существует, и (integer) 0, если нет.
Чтобы вернуть значение поля, запустите команду hget, а затем укажите ключ хэша и поле, значение которого вы хотите получить:
hget poet:Verlaine nationality
"Francais"
Команда hmget использует тот же синтаксис, но может возвращать значения нескольких полей сразу:
hmget poet:Verlaine born died
1) "1844"
2) "1896"
Если хэш, который вы передаете hget или hmget, не существует, обе команды вернут (nil):
hmget poet:Dickinson born died
1) (nil)
2) (nil)
Чтобы получить список всех полей, содержащихся в определенном хэше, выполните команду hkeys:
hkeys poet:Verlaine
1) "nationality"
2) "born"
3) "died"
4) "genre"
Чтобы получить список значений, содержащихся в хэше, запустите hvals:
hvals poet:Verlaine
1) "French"
2) "1844"
3) "1896"
4) "Decadent"
Чтобы вернуть список всех полей в хэше и связанных с ними значений, запустите hgetall:
hgetall poet:Verlaine
1) "nationality"
2) "French"
3) "born"
4) "1844"
5) "died"
6) "1896"
7) "genre"
8) "Decadent"
Вы можете узнать количество полей в хэше, запустив hlen, что расшифровывается как «hash length»:
hlen poet:Verlaine
(integer) 4
Вы можете узнать длину строки значения, связанной с конкретным полем, с помощью команды hstrlen, что расшифровывается как «hash string length»:
hstrlen poet:Verlaine nationality
(integer) 8
Команда hlen вернет (integer) 0, если хэша не существует.
Удаление полей из хэшей
Чтобы удалить поле из хэша, выполните команду hdel. Она может принимать несколько полей в качестве аргументов и возвращает целое число, указывающее, сколько полей было удалено из хэша:
hdel poet:Verlaine born died
(integer) 2
Если вы передадите команде hdel несуществующее поле, она будет игнорировать это поле, но удалит все другие существующие поля, которые вы укажете.
5.Управление списками
Создание списков
Ключ может содержать только один список. Список может содержать более четырех миллиардов элементов. Redis читает списки слева направо. Вы можете помещать новые элементы в начало списка (его «левый» конец) с помощью команды lpush или в конец («правый» конец) с помощью rpush. Вы также можете использовать команды lpush или rpush для создания нового списка:
lpush key value
Обе команды выведут целое число, показывающее, сколько элементов существует в данном списке. Чтобы увидеть, как это работает, выполните следующие команды для создания списка, содержащего изречение «I think therefore I am»:
lpush key_philosophy1 "therefore"
lpush key_philosophy1 "think"
rpush key_philosophy1 "I"
lpush key_philosophy1 "I"
rpush key_philosophy1 "am"
Вывод последней команды будет выглядеть так:
(integer) 5
Обратите внимание: вы можете добавить в список несколько элементов с помощью одного оператора lpush или rpush:
rpush key_philosophy1 "-" "Rene" "Decartes"
Команды lpushx и rpushx также позволяют добавлять элементы в список, но только в том случае, если заданный список уже существует. Если любая из команд не может быть выполнена, она вернет (integer) 0:
rpushx key_philosophy2 "Happiness" "is" "the" "highest" "good" "–" "Aristotle"
(integer) 0
Чтобы изменить существующий элемент в списке, выполните команду lset, за которой укажите имя ключа, индекс элемента, который вы хотите изменить, и новое значение:
lset key_philosophy1 5 "sayeth"
Если вы попытаетесь добавить новый элемент к существующему ключу, который не содержит список, это приведет к конфликту типов данных и вернет ошибку. Например, следующая команда set создает ключ, содержащий строку (а не список), поэтому попытка добавить элемент списка с помощью lpush закончится ошибкой:
set key_philosophy3 "What is love?"
lpush key_philosophy3 "Baby don't hurt me"
(error) WRONGTYPE Operation against a key holding the wrong kind of value
Преобразовать ключи Redis из одного типа данных в другой невозможно. То есть, чтобы превратить key_philosophy3 в список, вам необходимо удалить этот ключ и создать его снова с помощью команды lpush или rpush.
Извлечение элементов из списка
Чтобы получить диапазон элементов в списке, используйте команду lrange, за которой укажите начальное и конечное смещение. Каждое смещение – это индекс с нулевой базой, то есть 0 является первым элементом в списке, далее идет 1, 2 и т.д.
Следующая команда вернет все элементы из нашего примера – списка, созданного в предыдущем разделе:
lrange key_philosophy1 0 7
1) "I"
2) "think"
3) "therefore"
4) "I"
5) "am"
6) "sayeth"
7) "Rene"
8) "Decartes"
Смещения, передаваемые в lrange, также могут быть выражены отрицательными числами. В этом случае -1 представляет последний элемент в списке, -2 – второй в элемент и т.д. В следующем примере команда возвращает последние три элемента списка, хранящиеся в key_philosophy1:
lrange key_philosophy1 -3 -1
1) "I"
2) "am"
3) "sayeth"
Чтобы извлечь из списка отдельный элемент, вы можете использовать команду lindex. Однако эта команда требует, чтобы вы указали индекс элемента в качестве аргумента. Как и в случае с lrange, индексация начинается с нуля, что означает, что первый элемент имеет индекс 0, второй – индекс 1 и т. д.
lindex key_philosophy1 4
"am"
Чтобы узнать, сколько элементов содержится в данном списке, используйте команду llen, которая означает «list length»:
llen key_philosophy1
(integer) 8
Если значение, хранящееся в заданном ключе, не существует, llen вернет ошибку.
Удаление элементов из списка
Команда lrem удаляет первое из определенного числа вхождений, соответствующих данному значению. Чтобы попробовать поработать с этим, создайте следующий список:
rpush key_Bond "Never" "Say" "Never" "Again" "You" "Only" "Live" "Twice" "Live" "and" "Let" "Die" "Tomorrow" "Never" "Dies"
Следующая команда lrem удалит первое вхождение значения “Live”:
lrem key_Bond 1 "Live"
Эта команда выведет количество элементов, удаленных из списка:
(integer) 1
Команде lrem также можно передавать отрицательные числа. В следующем примере команда удалит два последних вхождения значения “Never”:
lrem key_Bond -2 "Never"
(integer) 2
Команда lpop удаляет и возвращает первый – или «самый левый» – элемент из списка:
lpop key_Bond
"Never"
Чтобы удалить и вернуть последний («самый правый») элемент списка, используйте rpop:
rpop key_Bond
"Dies"
Redis также включает команду rpoplpush, которая удаляет последний элемент из списка и помещает его в начало другого списка:
rpoplpush key_Bond key_AfterToday
"Tomorrow"
Если исходный и целевой ключ, переданные команде rpoplpush, совпадают, они по сути ротируют элементы в списке.
6.Управление строками
Создание строк
Ключи, содержащие строки, могут содержать только одно значение; нельзя хранить более одной строки в одном ключе. Однако строки в Redis являются бинарно-безопасными – то есть строка Redis может содержать любые данные, от буквенно-цифровых символов до изображений JPEG. Единственное ограничение – длина строки, она не должна превышать 512 МБ.
Чтобы создать строку, используйте команду set. Например, следующая команда set создает ключ key_Welcome1, который содержит строку «Howdy»:
set key_Welcome1 "Howdy"
OK
Чтобы создать несколько строк в одной команде, используйте mset:
mset key_Welcome2 "there" key_Welcome3 "partners,"
Также для создания строк вы можете использовать команду append:
append key_Welcome4 "welcome to Texas"
Если строка была создана успешно, append выведет целое число, равное количеству символов в строке:
(integer) 16
Обратите внимание: команду append также можно использовать для изменения содержимого строк. Подробнее мы поговорим об этом чуть позже.
Извлечение строк
Чтобы извлечь строку, используйте команду get.
get key_Welcome1
"Howdy"
Чтобы извлечь несколько строк, используйте mget:
mget key_Welcome1 key_Welcome2 key_Welcome3 key_Welcome4
1) "Howdy"
2) "there"
3) "partners,"
4) "welcome to Texas"
Если какой-либо из заданных ключей не содержит строковое значение или не существует, команда mget вернет nil.
Управление строками
Если строка состоит из целого числа, вы можете запустить команду incr, чтобы увеличить ее значение на единицу:
set key_1 3
incr key_1
(integer) 4
Аналогичным образом команду incrby можно использовать, чтобы увеличить числовое значение строки на определенный шаг:
incrby key_1 16
(integer) 20
Команды decr и decrby работают точно так же, только они уменьшают целое число, хранящееся в числовой строке:
decr key_1
(integer) 19
decrby key_1 16
(integer) 3
Если буквенная строка уже существует, append добавит значение в конец существующего значения и вернет новую длину строки. К примеру, следующая команда добавляет «, y’all» к строке, содержащейся в ключе key_Welcome4, поэтому теперь строка будет выглядеть так: “welcome to Texas, y’all”.
append key_Welcome4 ", y'all"
(integer) 15
Вы также можете вставить целые числа в строку, содержащую числовое значение. В следующем примере 45 вставляется в конец значения 3 (это целое число содержится в key_1), поэтому в результате получится 345. В этом случае append также возвратит новую длину строки, а не ее значение:
append key_1 45
(integer) 3
Поскольку этот ключ по-прежнему содержит только числовое значение, вы можете выполнять над ним операции incr и decr. Вы также можете добавить к целочисленной строке буквенные символы, но в таком случае выполнение incr и decr для этой строки приведет к ошибке, поскольку ее значение больше не является целым числом.
7.Подключение к базе redis
Подключение к Redis
Если вы работаете с локальной установкой redis-server, вы можете подключиться к экземпляру Redis с помощью команды redis-cli:
redis-cli
Это переведет вас в интерактивный режим redis-cli, который предоставляет REPL (read-eval-print loop), где вы можете запускать встроенные команды Redis и получать ответы.
В интерактивном режиме префикс командной строки изменится: теперь в нем указывается соединение с локальным экземпляром Redis (127.0.0.1) и порт Redis по умолчанию (6379).
127.0.0.1:6379˃
Альтернативой интерактивному режиму Redis является запуск команд в качестве аргументов команды redis-cli. Делается это так:
redis-cli redis_command
Если вы хотите подключиться к удаленному хранилищу данных Redis, вы можете указать хосты и номера портов с помощью флагов -h и -p. Если вы настроили аутентификацию Redis, вы можете включить флаг -a и указать ваш пароль:
redis-cli -h host -p port_number -a password
Если вы установили пароль Redis, клиенты смогут подключаться к базе данных, даже если они не включат флаг -a в свою команду redis-cli. Однако они не смогут добавлять, изменять или запрашивать данные до тех пор, пока не пройдут аутентификацию. Чтобы пройти аутентификацию после подключения, используйте команду auth и укажите пароль:
auth password
Если пароль, переданный в команде auth, действителен, команда вернет OK. В противном случае она вернет ошибку.
Если вы работаете с управляемой базой данных Redis, ваш облачный провайдер может предоставить вам URI, начинающийся с redis:// или rediss://, который вы можете использовать для доступа к вашему хранилищу данных. Если строка подключения начинается с redis://, вы можете включить ее в качестве аргумента в redis-cli.
Однако если строка подключения начинается с rediss://, то вашей управляемой базе данных требуются соединения по TLS/SSL. Команда redis-cli не поддерживает соединения TLS, поэтому для соединения по URI вам нужно использовать другой инструмент с поддержкой этого протокола – например, Redli.
Используйте следующий синтаксис для подключения к базе данных с помощью Redli. Обратите внимание, этот пример включает опцию –tls, которая указывает, что соединение должно быть установлено через TLS, и флаг -u, который объявляет, что следующий аргумент содержит URI соединения:
redli --tls -u rediss://connection_URI
Если вы попытаетесь подключиться к несуществующему экземпляру, redis-cli перейдет в отключенный режим. Командная строка будет отражать это:
not connected˃
В этом режиме Redis будет пытаться восстановить соединение при каждом новом запуске команды.
Тестирование соединений
Команда ping позволяет проверить работоспособность соединения с базой данных. Обратите внимание: это внутренняя команда Redis, а не сетевая утилита ping. Но работают эти две команды одинаково – обе они используются для проверки соединения между двумя машинами.
Если соединение установлено, а команда ping запущена без аргументов, она вернет PONG:
ping
PONG
Если вы предоставите команде аргумент, она вернет этот аргумент вместо PONG, если соединение установлено:
ping "hello Redis!"
"hello Redis!"
Если вы запустите ping или любую другую команду в отключенном режиме, вы увидите подобный вывод:
ping
Could not connect to Redis at host:port: Connection refused
Обратите внимание, ping также используется в Redis для измерения задержки.
Отключение от Redis
Чтобы отключиться от экземпляра Redis, используйте команду quit:
quit
Команда exit также завершит соединение:
exit
Обе эти команды закрывают соединение, но только после того, как все ожидающие ответы будут записаны на клиентах.
8.Управление базами данных 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 только после того, как эта команда завершит работу.