Как очистить базу данных Redis без перезапуска сервера
Redis — высокопроизводительная in-memory база данных, широко используемая для кэширования, хранения сессий и реализации очередей. Однако в процессе эксплуатации накапливается устаревшая или ненужная информация, которая может занимать память и мешать стабильной работе. В таких случаях возникает необходимость очистить базу данных Redis без остановки сервера, чтобы избежать простоев и потери доступности сервисов. К счастью, Redis предоставляет несколько безопасных и эффективных способов выполнить очистку «на лету».
- FLUSHDB vs FLUSHALL: в чём разница и когда что использовать
- Пример использования
- Как безопасно использовать FLUSH-команды
- Автоматизация через скрипты
- Асинхронная очистка: FLUSHALL ASYNC и FLUSHDB ASYNC
- Как проверить поддержку ASYNC
- Очистка по шаблону ключей: как удалить часть данных выборочно
- Очистка с TTL
- Распространённые ошибки и риски при очистке
- Как отследить выполнение FLUSH
- Лучшие практики и профилактика
- Чек-лист перед очисткой
- Экспертное мнение
- Вопросы и ответы
- Заключение
FLUSHDB vs FLUSHALL: в чём разница и когда что использовать
Redis поддерживает работу с несколькими базами данных (по умолчанию 16, от DB 0 до DB 15). Это позволяет логически разделять данные, например, по окружениям (dev, stage, prod) или по типу (кэш, сессии, временные данные). При необходимости очистки важно понимать, какие именно данные нужно удалить.
Команда FLUSHDB очищает только текущую активную базу данных. Если вы подключены к DB 0, будет удалено всё содержимое именно этой БД. Остальные базы (DB 1–15) останутся нетронутыми. Это полезно, когда требуется обновить кэш или начать тестирование с чистого листа в изолированной среде.
Команда FLUSHALL удаляет все ключи во всех базах данных Redis. Она применяется, когда нужна полная очистка всего экземпляра — например, при миграции, восстановлении после сбоя или подготовке к развёртыванию новой версии приложения.
SELECT или получить информацию о текущем состоянии через INFO keyspace.Выбор между FLUSHDB и FLUSHALL зависит от масштаба задачи:
- Если работаете с одним приложением и используете одну БД — достаточно FLUSHDB.
- Если на одном инстансе Redis запущено несколько сервисов — FLUSHALL затронет всех, будьте осторожны.
- В продакшене FLUSHALL может быть опасен, если не учтены зависимости других систем.
Пример использования
Подключение к Redis CLI и выполнение команд:
- Откройте терминал и подключитесь:
redis-cli - Проверьте, в какой БД вы находитесь:
SELECT 0 - Выполните очистку:
FLUSHDB - Убедитесь, что база пуста:
KEYS *— должен вернуть пустой результат.
Как безопасно использовать FLUSH-команды
Несмотря на простоту синтаксиса, использование FLUSH-команд требует осторожности. Удаление данных — необратимая операция. Ниже приведён пошаговый алгоритм безопасной очистки.
- Оцените последствия. Проверьте, какие приложения зависят от текущих данных. Используйте
CLIENT LIST, чтобы увидеть активных подключений. - Сделайте снимок состояния. Если включено сохранение на диск (RDB), убедитесь, что последний дамп актуален. Можно вручную вызвать
SAVEилиBGSAVE. - Выберите время. Выполняйте очистку в периоды минимальной нагрузки, чтобы минимизировать влияние на пользователей.
- Используйте асинхронный режим (рекомендуется). С версии Redis 4.0+ доступны команды
FLUSHDB ASYNCиFLUSHALL ASYNC. Они освобождают память в фоне, не блокируя сервер. - Подтвердите результат. После выполнения проверьте количество ключей:
DBSIZEдолжно вернуть 0.
Автоматизация через скрипты
Можно интегрировать очистку в CI/CD-процессы. Пример bash-скрипта:
#!/bin/bash REDIS_HOST="localhost" REDIS_PORT="6379" echo "Проверка количества ключей..." redis-cli -h $REDIS_HOST -p $REDIS_PORT DBSIZE echo "Выполнение FLUSHDB..." redis-cli -h $REDIS_HOST -p $REDIS_PORT FLUSHDB echo "Очистка завершена. Текущее количество ключей:" redis-cli -h $REDIS_HOST -p $REDIS_PORT DBSIZE
Убедитесь, что скрипт имеет права на выполнение и протестирован.
Асинхронная очистка: FLUSHALL ASYNC и FLUSHDB ASYNC
До появления асинхронных версий FLUSH-команд основная проблема заключалась в блокировке сервера. При большом объёме данных (например, миллионы ключей) операция могла занять секунды или даже минуты, в течение которых Redis не отвечал на запросы. Это было критично для production-систем.
Начиная с Redis 4.0, были введены команды:
FLUSHDB ASYNC— асинхронная очистка текущей БДFLUSHALL ASYNC— асинхронная очистка всех БД
Эти команды используют механизм lazyfree, при котором память освобождается в фоновом потоке. Сервер продолжает обрабатывать запросы, а сбор мусора выполняется параллельно.
Параметр |
Синхронная очистка (SYNC) |
Асинхронная очистка (ASYNC) |
|---|---|---|
Блокировка сервера |
Да, до завершения |
Нет (минимальная задержка) |
Требования к памяти |
Норма |
Временно выше (фоновая обработка) |
Риск downtime |
Высокий при больших объёмах |
Минимальный |
Рекомендуемый сценарий |
Тестовые среды, малые БД |
Продакшен, крупные системы |
Как проверить поддержку ASYNC
Выполните в redis-cli:
INFO COMMANDSTATS
Найдите строки с flushdb и flushall. Если в статистике есть вызовы с аргументом async — функция работает.
Также можно проверить версию:
INFO SERVER
Если версия ниже 4.0 — обновитесь для использования ASYNC.
Очистка по шаблону ключей: как удалить часть данных выборочно
Иногда требуется не полная очистка, а удаление только определённого типа данных — например, всех ключей, начинающихся с session: или cache:. В этом случае FLUSHDB/FLUSHALL не подходят.
Решение — комбинировать команды SCAN и DEL.
- Используйте
SCANдля итеративного обхода ключей по шаблону. - Фильтруйте их с помощью параметра
MATCH. - Передавайте найденные ключи в
DEL.
Пример:
-- Получить первые 100 ключей, начинающихся с "temp:" SCAN 0 MATCH temp:* COUNT 100
Ответ содержит курсор и список ключей. Повторяйте, пока курсор не вернёт 0.
Для автоматизации — скрипт на Python:
import redis r = redis.Redis(host='localhost', port=6379, db=0) cursor = '0' while cursor != 0: cursor, keys = r.scan(cursor=cursor, match='temp:*', count=100) if keys: r.delete(*keys)
Очистка с TTL
Если вы контролируете создание ключей, лучший подход — установка TTL (времени жизни). Например:
SETEX session:abc123 3600 "user_data"
Такие ключи исчезнут автоматически. Это снижает потребность в ручной очистке.
Распространённые ошибки и риски при очистке
Несмотря на простоту команд, многие администраторы сталкиваются с последствиями неверного использования. Ниже — типичные сценарии.
- Очистка не той базы данных. Подключились к DB 0, а данные были в DB 2. Решение — всегда проверять номер БД перед FLUSH.
- FLUSHALL вместо FLUSHDB. Особенно опасно в shared-инфраструктуре. Может повлиять на другие команды и проекты.
- Выполнение в пиковой нагрузке. Даже ASYNC-очистка увеличивает нагрузку на CPU и память. Лучше планировать на ночь или выходные.
- Отсутствие резервной копии. Если RDB отключён, восстановить данные невозможно. Настройте регулярные бэкапы.
- Очистка без уведомления команды. Разработчики могут потерять сессии, кэш или временные данные. Сообщайте заранее.
Как отследить выполнение FLUSH
Redis ведёт журнал команд, если включён AOF (Append Only File). В файле appendonly.aof появится запись:
*2 $6 FLUSHDB $5 ASYNC
Также можно использовать MONGO-подобный мониторинг:
redis-cli MONITOR
Это покажет все входящие команды в реальном времени.
Лучшие практики и профилактика
Чтобы минимизировать необходимость в экстренной очистке, следуйте этим рекомендациям.
- Разделяйте базы данных по назначению. Используйте DB 0 для кэша, DB 1 для сессий, DB 2 для временных задач. Это упрощает управление.
- Настройте TTL для всех временных ключей. Это предотвращает накопление «мусора».
- Регулярно мониторьте использование памяти. Используйте
INFO MEMORYи интегрируйте с Prometheus/Grafana. - Автоматизируйте очистку через cron. Например, ночная очистка тестовых данных.
- Ограничьте доступ к FLUSH-командам. В production лучше отключить их через
rename-commandв конфиге.
Пример настройки в redis.conf:
rename-command FLUSHDB "" rename-command FLUSHALL ""
Это полностью запрещает выполнение этих команд. Или переименуйте в сложные строки:
rename-command FLUSHALL FLUSHALL_8xL2mPqW
Чек-лист перед очисткой
- Проверен номер активной БД (
SELECT) - Сделан снимок состояния (
BGSAVE) - Уведомлены заинтересованные стороны
- Выбрано время с низкой нагрузкой
- Используется ASYNC-режим (если возможно)
- Команда протестирована в staging
Экспертное мнение
Очистка базы данных — не признак плохой архитектуры, а часть нормального жизненного цикла системы. Однако частые FLUSH-операции могут указывать на проблемы: отсутствие TTL, неэффективное управление кэшем или слабую стратегию инвалидации.
Предпочтительнее проектировать систему так, чтобы данные самоуничтожались. Например, кэш с TTL 1 час освобождает память автоматически. Также стоит рассмотреть использование Redis Modules, таких как RedisBloom или RedisTimeSeries, для более сложных сценариев.
Команды FLUSH — это «кнопка сброса», которую нужно применять осознанно. В идеале они должны использоваться редко: при деплоях, авариях или тестировании. В продакшене автоматическая очистка по расписанию — признак того, что что-то работает не так.
Вопросы и ответы
Заключение
Очистка базы данных Redis без перезапуска — стандартная и безопасная операция при соблюдении правил. Команды FLUSHDB и FLUSHALL позволяют быстро освободить память, а поддержка асинхронного режима делает их пригодными для использования в production-средах.
Главное — действовать осознанно: выбирать правильную команду, использовать ASYNC, планировать время и предварительно делать резервные копии. Автоматизация и ограничение доступа к чувствительным командам снижают риски человеческого фактора.
- FLUSHDB очищает одну базу, FLUSHALL — все базы.
- Используйте ASYNC-режим, чтобы избежать блокировок.
- Для выборочной очистки применяйте SCAN + DEL, а не KEYS.
- Настройте TTL и разделение БД для профилактики переполнения.
- Ограничьте доступ к FLUSH-командам в продакшене.
⚠️ Дисклеймер — нажмите, чтобы развернуть
Материалы, опубликованные в разделе «Блог» на сайте RU DESIGN SHOP (rudesignshop.ru), носят исключительно информационный и ознакомительный характер и не являются руководством к действию, финансовой рекомендацией, медицинской услугой, ветеринарным назначением либо рекламой товаров и услуг, включая азартные игры. Публикации не содержат призывов к участию в азартных играх и не направлены на продвижение соответствующих операторов.
Безопасность применения товаров и веществ: при использовании строительных материалов, бытовой химии, пестицидов и агрохимикатов необходимо строго следовать инструкциям производителя и действующему законодательству Российской Федерации, включая Федеральный закон РФ от 19.07.1997 № 109-ФЗ «О безопасном обращении с пестицидами и агрохимикатами».
Упоминание товарных знаков, брендов и организаций носит исключительно информационный характер и не означает наличие партнёрских отношений или одобрения со стороны правообладателей.
Материалы, содержащие сведения о медицинских, ветеринарных или косметических средствах, представлены в справочных целях и не являются медицинской консультацией или назначением. Перед применением рекомендуется обратиться к врачу, ветеринарному специалисту или иному сертифицированному профессионалу.
Возрастные ограничения: материалы, содержащие сведения о продукции категории 18+, включая алкоголь или азартные игры, предназначены исключительно для совершеннолетней аудитории и публикуются в информационных целях.
Правовая ответственность: решения, принятые на основе опубликованной информации, пользователь принимает самостоятельно и на свой риск; редакция и авторы несут ответственность в пределах, установленных законодательством Российской Федерации.
Редакция не допускает публикаций, содержащих пропаганду экстремизма, терроризма, наркотических средств или суицида; подобные материалы подлежат немедленному удалению.
Упоминание организаций с ограниченным статусом: компания Meta Platforms Inc. (социальные сети Facebook и Instagram) признана экстремистской организацией решением суда РФ, её деятельность запрещена на территории Российской Федерации; любые упоминания приводятся исключительно в информационных целях.
Авторские права и источники: информация собирается из открытых источников; её актуальность указывается на дату публикации и может изменяться.
Изображения и иллюстрации используются на условиях, разрешённых правообладателями. При возникновении претензий редакция готова оперативно рассмотреть обращение и внести необходимые изменения.
Персональные данные и cookies: сайт использует cookies и обрабатывает персональные данные пользователей в соответствии с Федеральным законом № 152-ФЗ «О персональных данных» и Политикой конфиденциальности RU DESIGN SHOP.
Мнения авторов могут не совпадать с позицией государственных органов или коммерческих организаций, упомянутых в материалах.