Роздрукуйте кількість клавіш у Redis


164

Чи є спосіб надрукувати кількість клавіш у Redis?

Мені відомо

keys *

Але це здається трохи важкою вагою. - З огляду на те, що Redis - це ключовий запас цінностей, можливо, це єдиний спосіб зробити це. Але я все-таки хотів би щось побачити за темою

count keys *

4
Існує запит на виклик для COUNT, але йому було відмовлено. github.com/antirez/redis/pull/32 antirez також прокоментував KEYS
Алекс

Мені було цікаво, чи не підтримали вони це так, як це було б O (n) - здогадуйтесь, це підтверджує це.
завантаження Енді

Відповіді:


199

Ви можете видати команду INFO, яка повертає інформацію та статистику про сервер. Тут див. Приклад результату.

Як згадувалося в коментарях mVChr, ви можете використовувати info keyspaceбезпосередньо на Redis-cli.


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

164

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
Mantas

4
Хтось збирається це прочитати, зробіть це на виробничій коробці якийсь день, не продумуючи його, а потім натисніть на край ... напевно, це вже сталося.
Стю Томпсон

2
Це повинно мати відмову від використання лише на невиробничих серверах. В іншому випадку слід скористатися redis.io/commands/SCAN
whitfin

40

Щоб отримати підрахунок загальної кількості ключів, використовуйте команду нижче:

127.0.0.1:6379> DBSIZE


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, закінчується термін = 366 Тут "клавіші" вказують на загальну відсутність клавіш, а "закінчується" вказує відсутність клавіш із встановленим терміном дії. По суті це означає, що вони мають набір ttl, і термін дії їх закінчується, а не те, що вони закінчилися.
s1d

-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.