Распечатать количество ключей в Redis

164

Есть ли способ напечатать количество ключей в Redis?

Я в курсе

keys *

Но это кажется немного тяжелым весом. - Учитывая, что Redis является хранилищем ключей, возможно, это единственный способ сделать это. Но я все еще хотел бы видеть что-то вроде

count keys *
Энди бот
источник
4
Есть запрос на получение COUNT, но он был отклонен. github.com/antirez/redis/pull/32 antirez также прокомментировал КЛЮЧИ
Алекс
Я задавался вопросом, не поддержали ли они это, поскольку это будет O (n) - думаю, это подтверждает это.
Энди загрузки

Ответы:

200

Вы можете выполнить команду INFO, которая возвращает информацию и статистику о сервере. Смотрите здесь для примера вывода.

Как уже упоминалось в комментариях mVChr, вы можете использовать info keyspaceнепосредственно на Redis-Cli.

hymloth
источник
1
redis-cli INFO Keyspace | grep ^db
Hackaholic
165

DBSIZE возвращает количество ключей и их легче разобрать.

Недостаток: если срок действия ключа истек, он все равно может считаться.

http://redis.io/commands/dbsize

seppo0010
источник
3
В этом примере KEYS *выселяет просроченный ключ. Также Redis может активно высылать некоторые просроченные ключи, но не обязательно все из них.
seppo0010
45

ВНИМАНИЕ: Не запускайте это на производственном оборудовании.

На коробке Linux:

redis-cli KEYS "*" | wc -l

Примечание. Как упоминалось в комментариях ниже, это операция O (N), поэтому на большой БД с большим количеством ключей ее не следует использовать. Для небольших развертываний, это должно быть хорошо.

Рептиликус
источник
3
Чрезвычайно удобный, и позволяет вам фильтровать ключи.
Ник Фарина
25
Это операция O (n), есть ли способ сделать это в O (1)?
Zoozy
21
Не используйте большие базы данных в производственной среде. KEYS Command
Мантас
4
Кто-то прочтет это, однажды сделает это на производственной коробке, не продумав этого, а затем протолкнув через край ... возможно, это уже произошло.
Стю Томпсон
2
Это должно иметь отказ от использования только на непроизводственных серверах. В противном случае вы должны использовать redis.io/commands/SCAN
whitfin
40

Для подсчета общего количества ключей используйте следующую команду:

127.0.0.1:6379> DBSIZE
Панкадж Чаухан
источник
24

использовать DBSIZE это не даст вам ключа

Возвращает количество ключей в выбранной в данный момент базе данных.

читать больше http://redis.io/commands/dbsize

Саурабх Чандра Патель
источник
14

Начиная с Redis 2.6, lua поддерживается, вы можете получить несколько таких символов

eval "return #redis.call('keys', 'prefix-*')" 0

см. команду eval

Цзинчао
источник
8
Использование KEYSдля подсчета ключей (с префиксом или без) - это все равно, что выбросить ребенка с водой.
Итамар Хабер
1
Для новичков Lua: #в этом коде есть оператор длины .
yzorg
4

dbsize() возвращает общее количество ключей.

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

Пример на питоне; считая все ключи, начинающиеся с prefix_:

import redis
r = redis.StrictRedis(host = 'localhost', port=6379)
iter=1000
print 'Approximately', r.dbsize() * float(sum([r.randomkey().startswith('prefix_') for i in xrange(iter)])) / iter

Даже iter=100дает достойную оценку в моем случае, но очень быстро, по сравнению с keys prefix_.

Улучшение состоит в том, чтобы отбирать 1000 ключей для каждого запроса, но сохранять общее количество, чтобы после двух запросов вы делили на 2000, а после трех запросов - на 3000. Таким образом, если ваше приложение заинтересовано в общем количестве сопоставления ключей довольно часто, то каждый раз он будет все ближе и ближе к истинному значению.

OSA
источник
1

После Redis 2.6 результат команды INFO делится на разделы. В разделе «пространство ключей» есть поля «ключи» и «ключи с истекшим сроком действия», чтобы указать количество ключей.

Цзянькуань Син
источник
4
Это не правильно. Это пример вывода раздела: # Keyspace db0: keys = 366, expires = 366 Здесь «keys» указывает общее количество ключей, а «expires» указывает отсутствие ключей с установленным сроком действия. По сути, это означает, что у них есть набор ttl, и они настроены на истечение срока действия, а не на то, что у них истек срок действия.
1
-1
eval "local count = redis.call('scan', 0, 'match', 'key:*:key', 'count', 10000) if count ~= 0 then return #count[2] end " 0

eval "local count = redis.call('sscan', 'key.key:all', 0, 'match', '*', 'count', 1000000) if count ~= 0 then return #count[2] end " 0
Лаох Тан
источник