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


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

165

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

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

http://redis.io/commands/dbsize


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



14

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

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

см. команду eval


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


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. Таким образом, если ваше приложение заинтересовано в общем количестве сопоставления ключей довольно часто, то каждый раз он будет все ближе и ближе к истинному значению.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.