Imprimir número de llaves en Redis

164

¿Hay alguna forma de imprimir el número de claves en Redis?

Estoy consciente de

keys *

Pero eso parece un poco pesado. - Dado que Redis es un almacén de valores clave, tal vez esta sea la única forma de hacerlo. Pero todavía me gustaría ver algo en la línea de

count keys *
andy boot
fuente
44
Hay una solicitud de extracción para COUNT, aunque fue denegada. github.com/antirez/redis/pull/32 antirez también comentó en KEYS
Alex
Me preguntaba si no lo habrían apoyado, ya que sería O (n); supongo que esto lo confirma.
Andy arranque

Respuestas:

199

Puede emitir el comando INFO, que devuelve información y estadísticas sobre el servidor. Vea aquí para un ejemplo de salida.

Como se menciona en los comentarios de mVChr, puede usar info keyspacedirectamente en el redis-cli.

hymloth
fuente
1
redis-cli INFO Keyspace | grep ^db
Hackaholic
164

DBSIZE devuelve el número de claves y es más fácil de analizar.

Desventaja: si una clave ha expirado, aún puede contar.

http://redis.io/commands/dbsize

seppo0010
fuente
3
En ese ejemplo, KEYS *desaloja la clave expirada. También Redis puede desalojar activamente algunas claves caducadas, pero no necesariamente todas.
seppo0010
45

ADVERTENCIA: No ejecute esto en una máquina de producción.

En una caja de Linux:

redis-cli KEYS "*" | wc -l

Nota: Como se menciona en los comentarios a continuación, esta es una operación O (N), por lo que en una base de datos grande con muchas teclas no debe usarla. Para implementaciones más pequeñas, debería estar bien.

reptilicus
fuente
3
Extremadamente práctico, y le permite filtrar las teclas también.
Nick Farina
25
Esa es una operación O (n), ¿hay alguna manera de hacer esto en O (1)?
Zoozy
21
No lo use en bases de datos grandes en entornos de producción. Comando KEYS
Mantas
44
Alguien va a leer esto, hacer esto en una caja de producción algún día sin pensarlo y luego empujarlo al límite ... probablemente ya ha sucedido.
Stu Thompson
2
Esto debería tener un descargo de responsabilidad para usar solo en servidores que no sean de producción. De lo contrario, debe usar redis.io/commands/SCAN
hasta
40

Para obtener el número total de teclas, use el siguiente comando:

127.0.0.1:6379> DBSIZE
Pankaj Chauhan
fuente
24

use DBSIZE esto no le dará clave

Devuelve el número de claves en la base de datos seleccionada actualmente.

para leer más http://redis.io/commands/dbsize

Saurabh Chandra Patel
fuente
14

Desde Redis 2.6, lua es compatible, puede obtener varias teclas comodín como esta

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

ver comando eval

jingchao
fuente
8
Usar KEYSpara contar llaves (con o sin prefijo) es como tirar al bebé con el agua del baño.
Itamar Haber
1
Para los novatos de Lua: #en este código es el operador de longitud .
yzorg
4

dbsize() Devuelve el número total de claves.

Puede estimar rápidamente el número de claves que coinciden con un patrón dado al muestrear claves al azar y luego verificar qué fracción de ellas coincide con el patrón.

Ejemplo en python; contando todas las claves que comienzan con 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

Incluso iter=100da una estimación decente en mi caso, pero es muy rápido, en comparación con keys prefix_.

Una mejora es probar 1000 claves en cada solicitud, pero mantener el recuento total, de modo que después de dos solicitudes se dividirá por 2000, después de tres solicitudes se dividirá por 3000. Por lo tanto, si su aplicación está interesada en el número total de teclas coincidentes con bastante frecuencia, luego cada vez se acercará más y más al valor real.

osa
fuente
1

Después de Redis 2.6, el resultado del comando INFO se divide por secciones. En la sección "espacio de claves", hay campos "claves" y "claves caducadas" para indicar cuántas claves hay.

Jiankuan Xing
fuente
44
Esto no es correcto. Esta es una salida de muestra de la sección: # Keyspace db0: keys = 366, expires = 366 Aquí, 'keys' indica el número total de claves y 'expires' indica que no hay claves con el conjunto de caducidad. Esencialmente significa que tienen un conjunto ttl y están configurados para expirar, no que hayan expirado.
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
fuente