Как очистить базу данных Redis без перезапуска сервера

Как очистить базу данных Redis без перезапуска сервера

Redis — высокопроизводительная in-memory база данных, широко используемая для кэширования, хранения сессий и реализации очередей. Однако в процессе эксплуатации накапливается устаревшая или ненужная информация, которая может занимать память и мешать стабильной работе. В таких случаях возникает необходимость очистить базу данных Redis без остановки сервера, чтобы избежать простоев и потери доступности сервисов. К счастью, Redis предоставляет несколько безопасных и эффективных способов выполнить очистку «на лету».

Чтобы очистить базу Redis без перезапуска, используйте команды FLUSHDB (для одной БД) или FLUSHALL (для всех баз). Они работают мгновенно и не требуют остановки сервера. Рекомендуется выполнять их в периоды низкой нагрузки и предварительно делать резервную копию, если включено сохранение на диск.

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 и выполнение команд:

  1. Откройте терминал и подключитесь: redis-cli
  2. Проверьте, в какой БД вы находитесь: SELECT 0
  3. Выполните очистку: FLUSHDB
  4. Убедитесь, что база пуста: KEYS * — должен вернуть пустой результат.

Как безопасно использовать FLUSH-команды

Несмотря на простоту синтаксиса, использование FLUSH-команд требует осторожности. Удаление данных — необратимая операция. Ниже приведён пошаговый алгоритм безопасной очистки.

  1. Оцените последствия. Проверьте, какие приложения зависят от текущих данных. Используйте CLIENT LIST, чтобы увидеть активных подключений.
  2. Сделайте снимок состояния. Если включено сохранение на диск (RDB), убедитесь, что последний дамп актуален. Можно вручную вызвать SAVE или BGSAVE.
  3. Выберите время. Выполняйте очистку в периоды минимальной нагрузки, чтобы минимизировать влияние на пользователей.
  4. Используйте асинхронный режим (рекомендуется). С версии Redis 4.0+ доступны команды FLUSHDB ASYNC и FLUSHALL ASYNC. Они освобождают память в фоне, не блокируя сервер.
  5. Подтвердите результат. После выполнения проверьте количество ключей: DBSIZE должно вернуть 0.
«Всегда тестируйте FLUSH-операции сначала в staging-среде. Даже если команда кажется безобидной, в реальных условиях она может повлиять на десятки микросервисов.» — Алексей М., DevOps-инженер, 12 лет опыта

Автоматизация через скрипты

Можно интегрировать очистку в 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
Высокий при больших объёмах
Минимальный
Рекомендуемый сценарий
Тестовые среды, малые БД
Продакшен, крупные системы
Полезно знать: Асинхронные команды доступны только если Redis собран с поддержкой lazyfree (по умолчанию включено в современных дистрибутивах).

Как проверить поддержку ASYNC

Выполните в redis-cli:

INFO COMMANDSTATS

Найдите строки с flushdb и flushall. Если в статистике есть вызовы с аргументом async — функция работает.
Также можно проверить версию:

INFO SERVER

Если версия ниже 4.0 — обновитесь для использования ASYNC.

Очистка по шаблону ключей: как удалить часть данных выборочно

Иногда требуется не полная очистка, а удаление только определённого типа данных — например, всех ключей, начинающихся с session: или cache:. В этом случае FLUSHDB/FLUSHALL не подходят.
Решение — комбинировать команды SCAN и DEL.

  1. Используйте SCAN для итеративного обхода ключей по шаблону.
  2. Фильтруйте их с помощью параметра MATCH.
  3. Передавайте найденные ключи в 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)
«Никогда не используйте KEYS * в продакшене. Эта команда блокирует Redis при большом количестве ключей. SCAN — безопасная альтернатива.» — Марина К., SRE, крупный e-commerce платформа

Очистка с 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

Это покажет все входящие команды в реальном времени.

Полезно знать: Команда FLUSH игнорируется политикой ограничения памяти (maxmemory). Она не связана с eviction-стратегиями, такими как volatile-lru или allkeys-lru.

Лучшие практики и профилактика

Чтобы минимизировать необходимость в экстренной очистке, следуйте этим рекомендациям.

  • Разделяйте базы данных по назначению. Используйте 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

Чек-лист перед очисткой

  1. Проверен номер активной БД (SELECT)
  2. Сделан снимок состояния (BGSAVE)
  3. Уведомлены заинтересованные стороны
  4. Выбрано время с низкой нагрузкой
  5. Используется ASYNC-режим (если возможно)
  6. Команда протестирована в staging

Экспертное мнение

Очистка базы данных — не признак плохой архитектуры, а часть нормального жизненного цикла системы. Однако частые FLUSH-операции могут указывать на проблемы: отсутствие TTL, неэффективное управление кэшем или слабую стратегию инвалидации.
Предпочтительнее проектировать систему так, чтобы данные самоуничтожались. Например, кэш с TTL 1 час освобождает память автоматически. Также стоит рассмотреть использование Redis Modules, таких как RedisBloom или RedisTimeSeries, для более сложных сценариев.
Команды FLUSH — это «кнопка сброса», которую нужно применять осознанно. В идеале они должны использоваться редко: при деплоях, авариях или тестировании. В продакшене автоматическая очистка по расписанию — признак того, что что-то работает не так.

Вопросы и ответы

Можно ли восстановить данные после FLUSHDB?
Нет, если только не включено сохранение на диск (RDB или AOF). При наличии дампа можно перезапустить Redis с резервной копией. Без бэкапа восстановление невозможно.
Влияет ли FLUSH на реплики?
Да. Команда реплицируется на все slave-серверы. После выполнения FLUSHALL на мастере все реплики также будут очищены.
Можно ли очистить Redis через API приложения?
Да. Большинство клиентских библиотек (например, redis-py, Jedis) поддерживают вызов FLUSHDB/FLUSHALL. Но будьте осторожны: не делайте это доступным через веб-интерфейс без аутентификации.
Чем отличается FLUSHDB от удаления всех ключей через DEL?
FLUSHDB — атомарная операция, выполняется быстрее и оптимизирована на уровне ядра Redis. DEL по каждому ключу — медленнее, особенно при большом количестве, и может блокировать сервер.
Безопасно ли использовать FLUSHALL в кластере Redis?
Да, но только если вы хотите очистить весь кластер. В Redis Cluster команда FLUSHALL применяется ко всем слотам и нодам. Для очистки одного шарда используйте FLUSHDB на конкретной ноде.

Заключение

Очистка базы данных Redis без перезапуска — стандартная и безопасная операция при соблюдении правил. Команды FLUSHDB и FLUSHALL позволяют быстро освободить память, а поддержка асинхронного режима делает их пригодными для использования в production-средах.
Главное — действовать осознанно: выбирать правильную команду, использовать ASYNC, планировать время и предварительно делать резервные копии. Автоматизация и ограничение доступа к чувствительным командам снижают риски человеческого фактора.

Redis остаётся надёжным решением для in-memory хранения, и его возможности управления данными позволяют администраторам эффективно поддерживать порядок в базе без простоев.
  • 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.

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

 

РЕКОМЕНДУЕМ
Товары от российских производителей
Светильник TUBUS Forstlight
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

Светильник TUBUS Forstlight

Диапазон цен: 20690  руб. – 32130  руб.
Подвесной светильник 44° — 1° OYSTER
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

Подвесной светильник 44° — 1° OYSTER

Диапазон цен: 50925  руб. – 98649  руб.