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 *

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.


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


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.


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



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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.