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 *

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.


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


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.


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



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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.