Imprimer le nombre de clés dans Redis


164

Existe-t-il un moyen d'imprimer le nombre de clés dans Redis?

je suis conscient de

keys *

Mais cela semble un peu lourd. - Étant donné que Redis est un magasin de valeurs clés, c'est peut-être la seule façon de le faire. Mais j'aimerais toujours voir quelque chose du genre

count keys *

4
Il y a une demande d'extraction pour COUNT, mais elle a été refusée. github.com/antirez/redis/pull/32 antirez a également commenté KEYS
Alex

Je me suis demandé s'ils ne l'avaient pas soutenu comme ce serait O (n) - je suppose que cela le confirme.
andy boot

Réponses:


200

Vous pouvez lancer la commande INFO, qui renvoie des informations et des statistiques sur le serveur. Voir ici pour un exemple de sortie.

Comme mentionné dans les commentaires de mVChr, vous pouvez utiliser info keyspacedirectement sur le redis-cli.


1
redis-cli INFO Keyspace | grep ^db
Hackaholic

165

DBSIZE renvoie le nombre de clés et il est plus facile à analyser.

Inconvénient: si une clé a expiré, elle peut encore compter.

http://redis.io/commands/dbsize


3
Dans cet exemple, KEYS *expulse la clé expirée. Redis peut également expulser activement certaines clés expirées, mais pas nécessairement toutes.
seppo0010

45

AVERTISSEMENT: ne l'exécutez pas sur une machine de production.

Sur une box Linux:

redis-cli KEYS "*" | wc -l

Remarque: comme mentionné dans les commentaires ci-dessous, il s'agit d'une opération O (N), donc sur une grande base de données avec de nombreuses clés, vous ne devez pas l'utiliser. Pour les petits déploiements, ça devrait aller.


3
Extrêmement pratique et vous permet également de filtrer sur les touches.
Nick Farina

25
C'est une opération O (n), y a-t-il un moyen de le faire dans O (1)?
Zoozy

21
Ne pas utiliser sur une grande base de données dans un environnement de production. KEYS Command
Mantas

4
Quelqu'un va lire ceci, le faire sur une boîte de production un jour sans y réfléchir et ensuite le pousser par-dessus bord ... c'est probablement déjà arrivé.
Stu Thompson

2
Cela devrait avoir une clause de non-responsabilité à utiliser uniquement sur des serveurs hors production. Sinon, vous devriez utiliser redis.io/commands/SCAN
whitfin

40

Pour obtenir le nombre total de clés, utilisez la commande ci-dessous:

127.0.0.1:6379> DBSIZE



4

dbsize() renvoie le nombre total de clés.

Vous pouvez estimer rapidement le nombre de clés correspondant à un modèle donné en échantillonnant les clés au hasard, puis en vérifiant quelle fraction d'entre elles correspond au modèle.

Exemple en python; compter toutes les clés commençant par 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

Même iter=100donne une estimation décente dans mon cas, mais est très rapide, par rapport à keys prefix_.

Une amélioration consiste à échantillonner 1000 clés à chaque demande, mais gardez le nombre total, de sorte qu'après deux demandes vous diviserez par 2000, après trois demandes vous diviserez par 3000. Ainsi, si votre application est intéressée par le nombre total des clés correspondantes assez souvent, puis à chaque fois, il se rapprochera de plus en plus de la valeur réelle.


1

Après Redis 2.6, le résultat de la commande INFO est divisé par sections. Dans la section «espace de clés», il y a des champs «clés» et «clés expirées» pour indiquer le nombre de clés présentes.


4
Ce n'est pas correct. Voici un exemple de sortie de la section: # Keyspace db0: keys = 366, expires = 366 Ici, «keys» indique le nombre total de clés et «expires» indique le nombre de clés avec expiration définie. Cela signifie essentiellement qu'ils ont un ensemble ttl et qu'ils sont prêts à expirer, pas qu'ils ont expiré.
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.