Какой командой полностью отчистить таблицу в Redis?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Полная очистка таблиц в Redis
В Redis не существует концепции "таблиц" в привычном смысле, как в SQL базах данных. Вместо этого Redis использует ключи и структуры данных (строки, списки, хеши, множества, отсортированные множества). Однако есть несколько способов очистить данные в зависимости от конкретной задачи.
Основные команды очистки
1. FLUSHDB — очистить текущую БД целиком
Это самая простая команда для полной очистки всех ключей текущей базы данных (по умолчанию БД 0):
import redis
client = redis.Redis(host="localhost", port=6379, db=0)
# Очистить текущую БД полностью
client.flushdb()
# С асинхронным удалением (быстрее)
client.flushdb(async_flush=True) # Redis 4.0+
2. FLUSHALL — очистить все БД
Если нужно удалить данные из всех 16 баз данных Redis:
# Очистить все БД целиком
client.flushall()
# Асинхронно
client.flushall(async_flush=True)
Очистка по паттерну (частичная)
3. Удаление ключей по маске
Если нужно удалить не всю БД, а только ключи, соответствующие определённому паттерну:
# Найти все ключи по паттерну и удалить
pattern = "user:*"
keys = client.keys(pattern)
if keys:
client.delete(*keys)
# Для больших наборов данных используй SCAN (итератор)
pipeline = client.pipeline()
for key in client.scan_iter(match="session:*"):
pipeline.delete(key)
if pipeline.command_stack.__len__() >= 100: # Batch удаление
pipeline.execute()
pipeline = client.pipeline()
pipeline.execute()
Практический пример: очистка таблицы кеша
from redis import Redis
from typing import Optional
class CacheManager:
def __init__(self, redis_url: str = "redis://localhost:6379/0"):
self.client = Redis.from_url(redis_url, decode_responses=True)
def clear_entire_cache(self) -> None:
"""Полная очистка текущей БД"""
self.client.flushdb()
print("Кеш полностью очищен")
def clear_cache_by_namespace(self, namespace: str) -> int:
"""Очистить кеш для определённого namespace"""
cursor = 0
deleted_count = 0
while True:
cursor, keys = self.client.scan(
cursor,
match=f"{namespace}:*",
count=1000
)
if keys:
deleted_count += self.client.delete(*keys)
if cursor == 0:
break
return deleted_count
def clear_expired_keys(self) -> None:
"""Redis автоматически удаляет истёкшие ключи (lazy deletion)
Можно использовать CONFIG rewrite для оптимизации"""
self.client.config_set("maxmemory-policy", "allkeys-lru")
print("Установлена политика вытеснения старых ключей")
# Использование
cache = CacheManager()
# Полная очистка
cache.clear_entire_cache()
# Очистка по namespace
deleted = cache.clear_cache_by_namespace("user_profile")
print(f"Удалено ключей: {deleted}")
CLI команды Redis
Если работаешь через redis-cli:
# Очистить текущую БД (0)
FLUSHDB
# Очистить все БД
FLUSHALL
# Асинхронная очистка (не блокирует)
FLUSHDB ASYNC
# Удалить ключи по паттерну
KEYS "user:*" | xargs redis-cli DEL
Важные замечания
- FLUSHDB vs FLUSHALL: FLUSHDB удаляет только текущую БД, FLUSHALL удаляет все
- Блокирующие операции: FLUSHDB без ASYNC может заблокировать Redis на время выполнения на больших базах
- async_flush=True: В Redis 4.0+ добавлена асинхронная очистка для избежания блокировок
- SCAN vs KEYS: Используй SCAN для больших наборов данных, KEYS блокирует Redis
- Безопасность: FLUSHDB и FLUSHALL лучше отключить в продакшене (CONFIG SET "databases" "1")
Для большинства задач достаточно FLUSHDB — это полностью очищает текущую базу данных Redis.