Imprimir número de chaves no Redis

164

Existe uma maneira de imprimir o número de chaves no Redis?

Estou ciente

keys *

Mas isso parece um pouco pesado. - Como o Redis é um armazenamento de valores-chave, talvez essa seja a única maneira de fazê-lo. Mas eu ainda gostaria de ver algo ao longo das linhas de

count keys *
andy boot
fonte
4
Há uma solicitação de recebimento de COUNT, mas foi negada. github.com/antirez/redis/pull/32 antirez também comentou em KEYS
Alex
Eu me perguntei se eles não o teriam apoiado, pois seria O (n) - acho que isso confirma isso.
andy arrancar

Respostas:

199

Você pode emitir o comando INFO, que retorna informações e estatísticas sobre o servidor. Veja aqui um exemplo de saída.

Como mencionado nos comentários do mVChr, você pode usar info keyspacediretamente no redis-cli.

hymloth
fonte
1
redis-cli INFO Keyspace | grep ^db
Hackaholic 10/07/19
164

DBSIZE retorna o número de chaves e é mais fácil analisar.

Desvantagem: se uma chave expirou, ela ainda poderá contar.

http://redis.io/commands/dbsize

seppo0010
fonte
3
Nesse exemplo, KEYS *despeja a chave expirada. Além disso, os Redis podem despejar ativamente algumas chaves expiradas, mas não necessariamente todas.
seppo0010
45

AVISO: Não execute isso em uma máquina de produção.

Em uma caixa Linux:

redis-cli KEYS "*" | wc -l

Nota: Conforme mencionado nos comentários abaixo, esta é uma operação O (N); portanto, em um banco de dados grande com muitas chaves, você não deve usá-lo. Para implantações menores, tudo bem.

reptilicus
fonte
3
Extremamente útil e permite filtrar as chaves também.
Nick Farina
25
Essa é uma operação O (n), existe alguma maneira de fazer isso em O (1)?
Zoozy
21
Não use no banco de dados grande no ambiente de produção. Comando KEYS
Mantas
4
Alguém vai ler isso, fazer isso em uma caixa de produção um dia sem pensar e depois empurrá-lo para o limite ... provavelmente já aconteceu.
Stu Thompson
2
Isso deve ter um aviso de isenção de responsabilidade para uso somente em servidores que não são de produção. Caso contrário, você deve usar redis.io/commands/SCAN
whitfin
40

Para obter o número total de chaves da contagem, use o comando abaixo:

127.0.0.1:6379> DBSIZE
Pankaj Chauhan
fonte
24

use DBSIZE isso não lhe dará nenhuma chave

Retornar o número de chaves no banco de dados selecionado no momento.

para ler mais http://redis.io/commands/dbsize

Saurabh Chandra Patel
fonte
14

Como o Redis 2.6, lua é suportado, você pode obter um número de chaves curinga como este

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

ver comando eval

jingchao
fonte
8
Usar KEYSpara contar as teclas (com ou sem prefixo) é como jogar o bebê para fora com a água do banho.
Itamar Haber
1
Para iniciantes de Lua: o #neste código é o operador de comprimento .
yzorg 17/08/19
4

dbsize() retorna o número total de chaves.

Você pode estimar rapidamente o número de chaves correspondentes a um determinado padrão, amostrando chaves aleatoriamente e depois verificando qual fração delas corresponde ao padrão.

Exemplo em python; contando todas as chaves começando com 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

Mesmo iter=100dá uma estimativa decente no meu caso, ainda é muito rápido, em comparação com keys prefix_.

Uma melhoria é obter uma amostra de 1000 chaves em cada solicitação, mas mantenha a contagem total, para que, após duas solicitações, você divida até 2000, após três solicitações, divida por 3000. Portanto, se seu aplicativo estiver interessado no número total de chaves correspondentes com bastante frequência, sempre que ele se aproximar cada vez mais do valor real.

osa
fonte
1

Após o Redis 2.6, o resultado do comando INFO é dividido por seções. Na seção "espaço de chaves", existem campos "chaves" e "chaves expiradas" para informar quantas chaves existem.

Jiankuan Xing
fonte
4
Isso não está correto. Esta é uma saída de amostra da seção: # Keyspace db0: keys = 366, expira = 366 Aqui, 'keys' indica o total de chaves e 'expires' indica não de chaves com expiração definida. Essencialmente, isso significa que eles têm um conjunto ttl e devem expirar, não que tenham 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
fonte