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 *
Andy boot
la source
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.

hymloth
la source
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

seppo0010
la source
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.

reptilicus
la source
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
Pankaj Chauhan
la source
24

utilisez DBSIZE ceci ne vous donnera aucune clé

Renvoie le nombre de clés dans la base de données actuellement sélectionnée.

pour en savoir plus http://redis.io/commands/dbsize

Saurabh Chandra Patel
la source
14

Depuis Redis 2.6, lua est pris en charge, vous pouvez obtenir un certain nombre de clés génériques comme ceci

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

voir la commande eval

jingchao
la source
8
Utiliser KEYSpour compter les clés (avec ou sans préfixe) revient à jeter le bébé avec l'eau du bain.
Itamar Haber
1
Pour les débutants en Lua: le #dans ce code est l' opérateur de longueur .
yzorg
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.

osa
la source
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.

Jiankuan Xing
la source
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
Laoch Tan
la source