Как определить количество ключей в Redis

Как определить количество ключей в Redis

Определить количество ключей в Redis можно с помощью команды `DBSIZE`, которая возвращает точное число ключей в текущей базе данных. Для более детального анализа подойдёт команда `INFO keyspace`, предоставляющая статистику по всем базам, включая просроченные ключи. При работе с кластерами или шардированными инсталляциями потребуется агрегация данных по всем узлам.

Чтобы быстро узнать количество ключей в Redis, используйте команду DBSIZE — она мгновенно покажет число ключей в активной базе. Для комплексного анализа, особенно в продакшене, предпочтительнее INFO keyspace, так как она даёт больше контекста, включая TTL и флаги удаления.

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

Команда DBSIZE: быстрый способ получить количество ключей

Команда `DBSIZE` — это самый прямой и эффективный способ узнать количество ключей в текущей базе данных Redis. Она возвращает целое число, соответствующее количеству ключей, находящихся в активной базе (по умолчанию — db0). Команда выполняется за O(1), то есть практически мгновенно, независимо от объёма данных.
Для вызова достаточно выполнить:

redis-cli dbsize

или внутри интерактивного режима:

127.0.0.1:6379> DBSIZE
(integer) 1542

Результат — точное число, включая все типы ключей: строки, хэши, списки, множества и т.д. Однако важно понимать, что `DBSIZE` не учитывает метаданные, такие как время жизни (TTL), и не показывает распределение по типам.

Полезно знать: DBSIZE не блокирует сервер и безопасен для использования в продакшене, даже при высокой нагрузке.

Когда использовать 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 keyspace — ваш главный инструмент для диагностики. Он позволяет не просто посчитать ключи, но и понять, насколько активно используется механизм TTL, что критично для кэшей.» — Алексей К., SRE-инженер, компания CloudScale

Преимущества INFO перед DBSIZE

  1. Позволяет увидеть состояние всех баз данных сразу, без переключения контекста.
  2. Показывает динамику: например, если expires близко к keys, значит, большинство данных временные.
  3. Подходит для интеграции с системами мониторинга (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 не гарантирует точного совпадения с DBSIZE, если в процессе идут операции записи/удаления. Используйте его только при необходимости фильтрации.

Когда SCAN предпочтительнее

  • Нужно посчитать ключи по маске, например, session:*.
  • Требуется определить количество ключей определённого типа (через TYPE key).
  • Необходимо провести аудит или экспорт части данных.

Недостатки метода

  • Производительность ниже, чем у DBSIZE — O(N), где N — количество ключей.
  • Может занимать значительное время при больших объёмах.
  • Не рекомендуется запускать в периоды пиковой нагрузки без ограничений по COUNT.

Как считать ключи в кластере Redis

В кластерной конфигурации Redis данные распределены между несколькими узлами, и каждый мастер-узел отвечает за свою долю слотов (всего 16384). Соответственно, общее количество ключей — это сумма ключей по всем мастер-узлам.
Для получения полной картины нужно:

  1. Подключиться к каждому мастер-узлу.
  2. Выполнить `DBSIZE` или `INFO keyspace`.
  3. Суммировать результаты.

Пример на Bash:

for node in $MASTER_NODES; do
 size=$(redis-cli -h $node dbsize)
 total=$((total + size))
done
echo "Общее количество ключей: $total"

Особенности кластерного учёта

  • Реплики не учитываются — они дублируют данные мастеров.
  • Использование `CLUSTER NODES` помогает определить, какие узлы являются мастерами.
  • В автоматизированных средах лучше использовать клиенты с поддержкой кластера (например, redis-py-cluster).
«В кластере всегда проверяйте состояние каждого мастера отдельно. Один «разбухший» слот может нарушить баланс и повлиять на доступность.» — Дмитрий В., DevOps-архитектор, платформа FastFlow

Распространённые ошибки и как их избежать

При определении количества ключей администраторы часто сталкиваются с ложными выводами из-за неправильного интерпретирования данных.

Ошибка 1: Смешение DBSIZE и KEYS *

Команда `KEYS *` возвращает список всех ключей, но блокирует сервер на время выполнения. В отличие от `DBSIZE`, она не подходит для продакшена. Использование `KEYS` на базе с миллионами ключей может привести к таймаутам и отказу сервиса.

Ошибка 2: Игнорирование expired_keys

Ключи с истёкшим TTL не удаляются мгновенно — Redis использует ленивое и активное удаление. Поэтому в `INFO keyspace` значение `expires` может быть высоким, даже если фактическая нагрузка снижается. Не путайте «просрочено» с «удалено».

Ошибка 3: Подсчёт реплик как независимых узлов

В кластере реплики содержат те же данные, что и мастеры. Учёт их ключей как отдельных приведёт к двукратному завышению итогового числа.

Ошибка 4: Отсутствие учёта баз данных

Redis поддерживает 16 баз данных (db0–db15). По умолчанию клиенты работают с db0, но приложения могут использовать другие. Если не проверить все базы, часть данных будет проигнорирована.

Полезно знать: В новых версиях Redis (6+) рекомендуется использовать одну базу и изоляцию через префиксы ключей, так как несколько БД усложняют миграцию и мониторинг.

Инструменты мониторинга и автоматизация

Для постоянного контроля количества ключей используются специализированные решения.

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.

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

Может ли DBSIZE вернуть неверное значение?
Теоретически — нет, команда основана на внутреннем счётчике, который обновляется при каждом добавлении или удалении ключа. Однако при наличии транзакций или Lua-скриптов возможны временные расхождения в момент выполнения, но после завершения они устраняются.
Как посчитать только ключи определённого типа?
Используйте SCAN с последующей проверкой типа:
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
Почему INFO keyspace показывает больше ключей, чем DBSIZE?
Такого быть не должно — обе команды считывают один и тот же счётчик. Расхождение может возникнуть, если вы проверяете разные базы или между запросами произошли изменения. Убедитесь, что вы смотрите на db0 и что нет фоновых процессов.
Как часто нужно проверять количество ключей?
Для критических систем — каждые 15–60 секунд через мониторинг. Для тестовых сред — по требованию. При подозрении на утечку — вручную каждые 5 минут, чтобы отследить тренд.
Влияет ли количество ключей на производительность Redis?
Косвенно — да. Большое число ключей увеличивает нагрузку на память и может замедлить операции, зависящие от обхода (например, BGSAVE, если много изменённых страниц). Также растёт время старта и восстановления из RDB.

Заключение

Определение количества ключей в Redis — базовая, но критически важная операция для администрирования и оптимизации. Наиболее эффективными методами остаются `DBSIZE` для быстрых проверок и `INFO keyspace` для глубокого анализа. В кластерных и распределённых средах необходима агрегация данных по мастер-узлам.

Выбор метода зависит от цели: мониторинг, аудит или диагностика. Главное — не просто фиксировать число, а интерпретировать его в контексте нагрузки, TTL и использования памяти. Регулярный учёт ключей помогает предотвращать инциденты и поддерживать стабильность системы.
  • Используйте 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.

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

 

РЕКОМЕНДУЕМ
Товары от российских производителей
-22%
Люстра SimpLumen UP GLODE
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

Люстра SimpLumen UP GLODE

Диапазон цен: 17650  руб. – 29600  руб.
Светильник MOON Forstlight
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

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

Диапазон цен: 29310  руб. – 62780  руб.
-40%
Настенный светильник OmniWall GLODE
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

Настенный светильник OmniWall GLODE

Диапазон цен: 17700  руб. – 114500  руб.