Drucken Sie die Anzahl der Schlüssel in Redis

164

Gibt es eine Möglichkeit, die Anzahl der Schlüssel in Redis zu drucken?

Ich bin mir bewusst, dass

keys *

Aber das scheint etwas schwer zu sein. - Angesichts der Tatsache, dass Redis ein Schlüsselwertspeicher ist, ist dies möglicherweise der einzige Weg, dies zu tun. Aber ich würde immer noch gerne etwas in der Art von sehen

count keys *
Andy Boot
quelle
4
Es gibt eine Pull-Anfrage für COUNT, die jedoch abgelehnt wurde. github.com/antirez/redis/pull/32 antirez kommentierte auch KEYS
Alex
Ich fragte mich, ob sie es nicht unterstützt hatten, da es O (n) wäre - denke, das bestätigt es.
Andy Boot

Antworten:

199

Sie können den Befehl INFO ausgeben, der Informationen und Statistiken zum Server zurückgibt. Siehe hier für ein Beispiel ausgegeben.

Wie in den Kommentaren von mVChr erwähnt, können Sie info keyspacedirekt auf der Redis-Cli verwenden.

Hymne
quelle
1
redis-cli INFO Keyspace | grep ^db
Hackaholic
164

DBSIZE Gibt die Anzahl der Schlüssel zurück und ist einfacher zu analysieren.

Nachteil: Wenn ein Schlüssel abgelaufen ist, zählt er möglicherweise noch.

http://redis.io/commands/dbsize

seppo0010
quelle
3
In diesem Beispiel wird KEYS *der abgelaufene Schlüssel entfernt. Außerdem kann Redis einige abgelaufene Schlüssel aktiv entfernen, jedoch nicht unbedingt alle.
seppo0010
45

WARNUNG: Führen Sie dies nicht auf einer Produktionsmaschine aus.

Auf einer Linux-Box:

redis-cli KEYS "*" | wc -l

Hinweis: Wie in den Kommentaren unten erwähnt, handelt es sich um eine O (N) -Operation. Bei einer großen Datenbank mit vielen Schlüsseln sollten Sie diese also nicht verwenden. Für kleinere Bereitstellungen sollte dies in Ordnung sein.

Reptilicus
quelle
3
Sehr praktisch und lässt Sie auch nach Schlüsseln filtern.
Nick Farina
25
Das ist eine O (n) -Operation. Gibt es eine Möglichkeit, dies in O (1) zu tun?
Zoozy
21
Nicht in großen Datenbanken in Produktionsumgebungen verwenden. KEYS Befehl
Mantas
4
Jemand wird das lesen, dies eines Tages auf einer Produktionsbox tun, ohne darüber nachzudenken, und es dann über den Rand schieben ... wahrscheinlich ist es bereits passiert.
Stu Thompson
2
Dies sollte einen Haftungsausschluss enthalten, der nur auf Nicht-Produktionsservern verwendet werden darf. Andernfalls sollten Sie redis.io/commands/SCAN
whitfin
40

Verwenden Sie den folgenden Befehl, um die Gesamtzahl der Schlüssel zu ermitteln:

127.0.0.1:6379> DBSIZE
Pankaj Chauhan
quelle
24

Wenn Sie DBSIZE dies verwenden, erhalten Sie keinen Schlüssel

Gibt die Anzahl der Schlüssel in der aktuell ausgewählten Datenbank zurück.

um mehr zu lesen http://redis.io/commands/dbsize

Saurabh Chandra Patel
quelle
14

Da Redis 2.6, lua unterstützt wird, können Sie eine solche Anzahl von Platzhalterschlüsseln erhalten

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

siehe eval befehl

Jingchao
quelle
8
Das KEYSZählen von Schlüsseln (mit oder ohne Präfix) ist wie das Herauswerfen des Babys mit dem Badewasser.
Itamar Haber
1
Für Lua-Neulinge: Der #in diesem Code angegebene Längenoperator .
Yzorg
4

dbsize() Gibt die Gesamtzahl der Schlüssel zurück.

Sie können die Anzahl der Schlüssel, die mit einem bestimmten Muster übereinstimmen, schnell abschätzen, indem Sie die Schlüssel nach dem Zufallsprinzip auswählen und dann überprüfen, welcher Teil davon mit dem Muster übereinstimmt.

Beispiel in Python; Zählen aller Schlüssel beginnend mit 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=100Gibt in meinem Fall sogar eine anständige Schätzung, ist aber im Vergleich zu sehr schnell keys prefix_.

Eine Verbesserung besteht darin, 1000 Schlüssel für jede Anforderung abzutasten, aber die Gesamtzahl beizubehalten, sodass Sie nach zwei Anforderungen durch 2000 und nach drei Anforderungen durch 3000 teilen. Wenn Ihre Anwendung also an der Gesamtzahl interessiert ist von übereinstimmenden Schlüsseln ziemlich oft, dann wird es jedes Mal näher und näher an den wahren Wert.

osa
quelle
1

Nach Redis 2.6 werden die Ergebnisse des INFO-Befehls in Abschnitte aufgeteilt. Im Abschnitt "Schlüsselbereich" gibt es Felder "Schlüssel" und "Abgelaufene Schlüssel", die angeben, wie viele Schlüssel vorhanden sind.

Jiankuan Xing
quelle
4
Das ist nicht richtig. Dies ist eine Beispielausgabe des Abschnitts: # Keyspace db0: keys = 366, expires = 366 Hier gibt 'keys' die Gesamtzahl der Schlüssel und 'expires' die Anzahl der Schlüssel mit festgelegtem Ablauf an. Im Wesentlichen bedeutet dies, dass sie einen ttl-Satz haben und ablaufen, nicht dass sie abgelaufen sind.
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
Laoch Tan
quelle