Как определить количество ключей в 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.

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

 

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

Люстра SimpLumen Pipe GLODE

17900  руб.

Купольное освещение ATLAS SYSTEM D2400 SN462

Первоначальная цена составляла 208800  руб..Текущая цена: 205500  руб..
Люстра Nimbus GLODE
Выберите параметры Этот товар имеет несколько вариаций. Опции можно выбрать на странице товара.

Люстра Nimbus GLODE

15048  руб.