Как определить количество ключей в Redis
Определить количество ключей в Redis можно с помощью команды `DBSIZE`, которая возвращает точное число ключей в текущей базе данных. Для более детального анализа подойдёт команда `INFO keyspace`, предоставляющая статистику по всем базам, включая просроченные ключи. При работе с кластерами или шардированными инсталляциями потребуется агрегация данных по всем узлам.
Redis — это высокопроизводительная in-memory база данных, широко применяемая для кэширования, хранения сессий, реализации очередей и управления состоянием в распределённых системах. Одной из типичных задач при администрировании и оптимизации производительности является получение точного количества ключей. Это необходимо для мониторинга использования памяти, выявления утечек, планирования масштабирования и оценки эффективности стратегии очистки. Несмотря на простоту вопроса, подход к решению зависит от окружения: одиночный сервер, репликация, кластер или облачная инфраструктура.
- Команда DBSIZE: быстрый способ получить количество ключей
- Когда использовать DBSIZE
- Ограничения DBSIZE
- INFO keyspace: глубокий анализ состояния базы
- Преимущества INFO перед DBSIZE
- Как извлечь данные из INFO keyspace
- SCAN и его роль в учёте ключей
- Когда SCAN предпочтительнее
- Недостатки метода
- Как считать ключи в кластере Redis
- Особенности кластерного учёта
- Распространённые ошибки и как их избежать
- Ошибка 1: Смешение DBSIZE и KEYS *
- Ошибка 2: Игнорирование expired_keys
- Ошибка 3: Подсчёт реплик как независимых узлов
- Ошибка 4: Отсутствие учёта баз данных
- Инструменты мониторинга и автоматизация
- Redis Exporter + Prometheus + Grafana
- RedisInsight
- Кастомные скрипты
- Экспертное мнение
- Вопросы и ответы
- Заключение
Команда DBSIZE: быстрый способ получить количество ключей
Команда `DBSIZE` — это самый прямой и эффективный способ узнать количество ключей в текущей базе данных Redis. Она возвращает целое число, соответствующее количеству ключей, находящихся в активной базе (по умолчанию — db0). Команда выполняется за O(1), то есть практически мгновенно, независимо от объёма данных.
Для вызова достаточно выполнить:
redis-cli dbsize
или внутри интерактивного режима:
127.0.0.1:6379> DBSIZE (integer) 1542
Результат — точное число, включая все типы ключей: строки, хэши, списки, множества и т.д. Однако важно понимать, что `DBSIZE` не учитывает метаданные, такие как время жизни (TTL), и не показывает распределение по типам.
Когда использовать DBSIZE
- При необходимости быстро проверить размер базы в реальном времени.
- В скриптах мониторинга, где важна скорость и минимальное влияние на производительность.
- Для сравнения состояния до и после операций очистки или импорта данных.
Ограничения DBSIZE
- Показывает данные только для одной базы за раз (номер выбирается через SELECT).
- Не предоставляет информации о просроченных, но ещё не удалённых ключах.
- Не работает в кластерном режиме напрямую — требует обхода по узлам.
INFO keyspace: глубокий анализ состояния базы
Команда `INFO keyspace` предлагает значительно более подробную информацию, чем `DBSIZE`. Она входит в состав универсальной команды `INFO`, которая выводит сотни метрик о состоянии сервера Redis. Раздел `keyspace` содержит статистику по каждой базе данных, включая количество ключей и количество истёкших (expired).
Пример вывода:
# Keyspace db0:keys=1542,expires=240,avg_ttl=45213 db1:keys=87,expires=12,avg_ttl=36000
Здесь:
- keys — общее количество ключей в базе;
- expires — количество ключей с установленным TTL;
- avg_ttl — среднее время жизни в миллисекундах.
Преимущества INFO перед DBSIZE
- Позволяет увидеть состояние всех баз данных сразу, без переключения контекста.
- Показывает динамику: например, если expires близко к keys, значит, большинство данных временные.
- Подходит для интеграции с системами мониторинга (Prometheus, Grafana) через экспортеры.
Как извлечь данные из INFO keyspace
Вы можете запросить только нужный раздел:
redis-cli info keyspace
или обработать вывод программно:
redis-cli --raw info keyspace | grep db0
Для автоматизации удобно использовать парсинг по строкам. Например, на Python:
import redis
r = redis.Redis()
info = r.info('keyspace')
print(info['db0']) # {'keys': 1542, 'expires': 240, 'avg_ttl': 45213}
Метрика |
Описание |
Типичное применение |
|---|---|---|
keys |
Общее число ключей в БД |
Оценка объёма данных, мониторинг роста |
expires |
Число ключей с TTL |
Анализ эффективности кэширования |
avg_ttl |
Среднее время жизни в мс |
Оптимизация политик очистки |
SCAN и его роль в учёте ключей
Хотя `SCAN` не предназначен для подсчёта ключей напрямую, он может быть использован для точного подсчёта с фильтрацией по шаблону или типу. Команда работает итеративно, возвращая часть ключей за один вызов, что делает её безопасной для использования в нагруженных системах.
Базовый синтаксис:
SCAN cursor [MATCH pattern] [COUNT count]
Для подсчёта всех ключей можно написать скрипт:
cursor = 0 count = 0 while True: cursor, keys = r.scan(cursor, count=100) count += len(keys) if cursor == 0: break
Когда SCAN предпочтительнее
- Нужно посчитать ключи по маске, например,
session:*. - Требуется определить количество ключей определённого типа (через TYPE key).
- Необходимо провести аудит или экспорт части данных.
Недостатки метода
- Производительность ниже, чем у DBSIZE — O(N), где N — количество ключей.
- Может занимать значительное время при больших объёмах.
- Не рекомендуется запускать в периоды пиковой нагрузки без ограничений по COUNT.
Как считать ключи в кластере Redis
В кластерной конфигурации Redis данные распределены между несколькими узлами, и каждый мастер-узел отвечает за свою долю слотов (всего 16384). Соответственно, общее количество ключей — это сумма ключей по всем мастер-узлам.
Для получения полной картины нужно:
- Подключиться к каждому мастер-узлу.
- Выполнить `DBSIZE` или `INFO keyspace`.
- Суммировать результаты.
Пример на Bash:
for node in $MASTER_NODES; do size=$(redis-cli -h $node dbsize) total=$((total + size)) done echo "Общее количество ключей: $total"
Особенности кластерного учёта
- Реплики не учитываются — они дублируют данные мастеров.
- Использование `CLUSTER NODES` помогает определить, какие узлы являются мастерами.
- В автоматизированных средах лучше использовать клиенты с поддержкой кластера (например, redis-py-cluster).
Распространённые ошибки и как их избежать
При определении количества ключей администраторы часто сталкиваются с ложными выводами из-за неправильного интерпретирования данных.
Ошибка 1: Смешение DBSIZE и KEYS *
Команда `KEYS *` возвращает список всех ключей, но блокирует сервер на время выполнения. В отличие от `DBSIZE`, она не подходит для продакшена. Использование `KEYS` на базе с миллионами ключей может привести к таймаутам и отказу сервиса.
Ошибка 2: Игнорирование expired_keys
Ключи с истёкшим TTL не удаляются мгновенно — Redis использует ленивое и активное удаление. Поэтому в `INFO keyspace` значение `expires` может быть высоким, даже если фактическая нагрузка снижается. Не путайте «просрочено» с «удалено».
Ошибка 3: Подсчёт реплик как независимых узлов
В кластере реплики содержат те же данные, что и мастеры. Учёт их ключей как отдельных приведёт к двукратному завышению итогового числа.
Ошибка 4: Отсутствие учёта баз данных
Redis поддерживает 16 баз данных (db0–db15). По умолчанию клиенты работают с db0, но приложения могут использовать другие. Если не проверить все базы, часть данных будет проигнорирована.
Инструменты мониторинга и автоматизация
Для постоянного контроля количества ключей используются специализированные решения.
Redis Exporter + Prometheus + Grafana
Популярный стек для сбора и визуализации метрик. Redis Exporter предоставляет метрики в формате, понятном Prometheus:
redis_db_keys— количество ключей по базам;redis_expired_keys_total— общее число истёкших ключей.
На основе этих данных можно строить графики роста, настраивать алерты при превышении порога (например, 1 млн ключей) и анализировать сезонность.
RedisInsight
Официальный GUI-инструмент от Redis Inc. Позволяет визуально отслеживать количество ключей, их распределение по типам и размерам. Особенно полезен для диагностики «тяжёлых» ключей и поиска утечек.
Кастомные скрипты
Для уникальных сценариев пишут скрипты на Python, Go или Bash. Пример:
- Ежечасный подсчёт ключей по префиксам.
- Сравнение с предыдущим замером и отправка уведомления при росте > 10%.
- Интеграция с CI/CD для проверки чистоты кэша перед деплоем.
Инструмент |
Преимущества |
Недостатки |
|---|---|---|
DBSIZE / INFO |
Встроен, быстрый, не требует зависимостей |
Только текущий узел, нет истории |
Prometheus + Exporter |
Графики, алерты, долгосрочный анализ |
Требует настройки и инфраструктуры |
RedisInsight |
Удобный UI, анализ типов и размеров |
Ресурсоёмкий, не всегда подходит для продакшена |
Экспертное мнение
При анализе количества ключей важно различать тактические и стратегические цели. Если вам нужно срочно проверить состояние — используйте `DBSIZE`. Если вы анализируете производительность, планируете масштабирование или расследуете утечку памяти — переходите на `INFO keyspace` и инструменты мониторинга.
Ключевой принцип: количество само по себе — лишь индикатор. Гораздо важнее — динамика роста, распределение по типам и соотношение с объёмом памяти. Например, 100 тысяч строковых ключей по 1 КБ займут меньше места, чем 1 тысяча хэшей с тысячами полей.
Также стоит учитывать политику удаления. Даже при активном использовании TTL, если `expired_keys` растёт, возможно, настройки активного удаления слишком консервативны (параметр `hz` в redis.conf). Увеличение `hz` с 10 до 20 может ускорить очистку, но повысит нагрузку на CPU.
Вопросы и ответы
cursor = 0 hash_count = 0 while True: cursor, keys = r.scan(cursor, count=100) for key in keys: if r.type(key) == 'hash': hash_count += 1 if cursor == 0: break
Заключение
Определение количества ключей в Redis — базовая, но критически важная операция для администрирования и оптимизации. Наиболее эффективными методами остаются `DBSIZE` для быстрых проверок и `INFO keyspace` для глубокого анализа. В кластерных и распределённых средах необходима агрегация данных по мастер-узлам.
- Используйте DBSIZE для быстрого и безопасного подсчёта в одной базе.
- Применяйте INFO keyspace для анализа динамики и распределения ключей.
- В кластере суммируйте значения по всем мастер-узлам.
- Избегайте команды KEYS * в продакшене — она блокирует сервер.
- Интегрируйте метрики в системы мониторинга для превентивного контроля.
⚠️ Дисклеймер — нажмите, чтобы развернуть
Материалы, опубликованные в разделе «Блог» на сайте RU DESIGN SHOP (rudesignshop.ru), носят исключительно информационный и ознакомительный характер и не являются руководством к действию, финансовой рекомендацией, медицинской услугой, ветеринарным назначением либо рекламой товаров и услуг, включая азартные игры. Публикации не содержат призывов к участию в азартных играх и не направлены на продвижение соответствующих операторов.
Безопасность применения товаров и веществ: при использовании строительных материалов, бытовой химии, пестицидов и агрохимикатов необходимо строго следовать инструкциям производителя и действующему законодательству Российской Федерации, включая Федеральный закон РФ от 19.07.1997 № 109-ФЗ «О безопасном обращении с пестицидами и агрохимикатами».
Упоминание товарных знаков, брендов и организаций носит исключительно информационный характер и не означает наличие партнёрских отношений или одобрения со стороны правообладателей.
Материалы, содержащие сведения о медицинских, ветеринарных или косметических средствах, представлены в справочных целях и не являются медицинской консультацией или назначением. Перед применением рекомендуется обратиться к врачу, ветеринарному специалисту или иному сертифицированному профессионалу.
Возрастные ограничения: материалы, содержащие сведения о продукции категории 18+, включая алкоголь или азартные игры, предназначены исключительно для совершеннолетней аудитории и публикуются в информационных целях.
Правовая ответственность: решения, принятые на основе опубликованной информации, пользователь принимает самостоятельно и на свой риск; редакция и авторы несут ответственность в пределах, установленных законодательством Российской Федерации.
Редакция не допускает публикаций, содержащих пропаганду экстремизма, терроризма, наркотических средств или суицида; подобные материалы подлежат немедленному удалению.
Упоминание организаций с ограниченным статусом: компания Meta Platforms Inc. (социальные сети Facebook и Instagram) признана экстремистской организацией решением суда РФ, её деятельность запрещена на территории Российской Федерации; любые упоминания приводятся исключительно в информационных целях.
Авторские права и источники: информация собирается из открытых источников; её актуальность указывается на дату публикации и может изменяться.
Изображения и иллюстрации используются на условиях, разрешённых правообладателями. При возникновении претензий редакция готова оперативно рассмотреть обращение и внести необходимые изменения.
Персональные данные и cookies: сайт использует cookies и обрабатывает персональные данные пользователей в соответствии с Федеральным законом № 152-ФЗ «О персональных данных» и Политикой конфиденциальности RU DESIGN SHOP.
Мнения авторов могут не совпадать с позицией государственных органов или коммерческих организаций, упомянутых в материалах.