obter todas as chaves definidas no memcached

131

Como posso obter todas as chaves definidas nas minhas instâncias do memcached?

Eu tentei pesquisar no Google, mas não encontrei muito, exceto o PHPsuporte a um getAllKeysmétodo , o que significa que é realmente possível fazer isso de alguma forma. Como posso obter o mesmo em uma sessão de telnet?

Eu tentei todas as opções relacionadas à recuperação mencionadas nas folhas de dicas do memcached e no resumo do comando telc do Memcached , mas nenhuma delas funciona e não consigo encontrar a maneira correta de fazer isso.

Nota: No momento, estou fazendo isso no desenvolvimento, portanto, pode-se supor que não haverá problemas devido à definição de novas chaves ou a outras condições de corrida, e o número de chaves também será limitado.

mu 無
fonte
Confira meu Post . Eu tive o mesmo problema e encontrei uma solução.
Peter VARGA
O github.com/clickalicious/phpmemadmin parece útil (se eu puder descobrir como fazê-lo funcionar com o Laravel Homestead Vagrant; atualmente ele não mostra chaves).
217 Ryan

Respostas:

178

Encontrei uma maneira, graças ao link aqui (com a discussão em grupo original do google aqui )

Primeiro, Telnetpara o seu servidor:

telnet 127.0.0.1 11211

A seguir, liste os itens para obter os IDs da laje:

itens de estatísticas
Itens STAT: 3: número 1
Itens STAT: 3: 498 anos
Itens STAT: 22: número 1
Itens STAT: 22: idade 498
FIM

O primeiro número após 'itens' é o ID da laje. Solicite um despejo de cache para cada ID da laje, com um limite para o número máximo de chaves a serem despejadas:

estatísticas cachedump 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
FIM

estatísticas em cache 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
FIM

mu 無
fonte
4
Observe que o stats cachedump é um recurso não documentado e não é suportado pela equipe do memcached. Destina-se apenas à depuração e não se destina ao uso em produção.
Mikewied
Ah ok. Como disse na minha pergunta, atualmente estou apenas no modo de desenvolvimento e precisava disso para depuração.
mu無
3
bé bytes, sé tempo de segundos segundos
Abraham Sangha
1
@ Dan Talvez você esteja visualizando primeiro as respostas ativas, que classificam as postagens de resposta com base na última vez que tiveram atividade. Se sim, você pode alterar isso selecionando um dos votos ativos / mais antigos / logo abaixo do texto da pergunta. Fora isso, esta resposta está no topo no modo de navegação anônima.
mu無
2
Também há lru_crawler metadump allque despejar todas as chaves de cache, e não "apenas" os primeiros 1M. Github.com/memcached/memcached/blob/…
Kaos
65

memdump

Existe um memcdumpmemdump comando (às vezes ) para isso (parte de libmemcached-tools), por exemplo:

memcdump --servers=localhost

que retornará todas as chaves.


memcached-tool

Na versão recente de memcachedtambém hámemcached-tool comando, por exemplo

memcached-tool localhost:11211 dump | less

que despeja todas as chaves e valores.

Veja também:

kenorb
fonte
4
cuidado com 'memdump' este comando é uma ótima maneira de travar seu terminal.
deweydb
5
Cuidado! O dumpsub-comando para memcached-toolparece limpar o cache :( --might ser mais seguro para uso displayou statspela primeira vez.
MarkHu
4
No Ubuntu Xenial, o pacote que contém o memdump é chamado libmemcached-toolse o binário da ferramenta é chamado memcdump.
thenickdude
5
Para aqueles que procuram memcached-toolé um pouco escondido em um diretório, que não pode estar em um padrão PATH- pelo menos no Ubuntu hospitaleiro - aqui:/usr/share/memcached/scripts/
sxc731
17

Baseie-se na resposta @mu here aqui. Eu escrevi um script de despejo de cache.

O script despeja todo o conteúdo de um servidor armazenado em cache. Ele foi testado com o Ubuntu 12.04 e um localhost memcached, então sua milhagem pode variar.

#!/usr/bin/env bash

echo 'stats items'  \
| nc localhost 11211  \
| grep -oe ':[0-9]*:'  \
| grep -oe '[0-9]*'  \
| sort  \
| uniq  \
| xargs -L1 -I{} bash -c 'echo "stats cachedump {} 1000" | nc localhost 11211'

O que faz, ele percorre todas as lajes de cache e imprime 1000 entradas de cada uma.

Esteja ciente de certos limites deste script, ou seja, ele pode não ser dimensionado para um servidor de cache de 5 GB, por exemplo. Mas é útil para fins de depuração em uma máquina local.

Omar Al-Ithawi
fonte
3
No Debian 8 com memcached 1.4.21-1.1+deb8u1eu tive que enviar explicitamente um comando quit para o memcached. Eu modifiquei seu comando para isso e funciona corretamente agora: echo -e "stats items\nquit" | nc localhost 11211 | grep -oe ':[0-9]*:' | grep -oe '[0-9]*' | sort | uniq | xargs -L1 -I{} bash -c 'echo -e "stats cachedump {} 1000\nquit" | nc localhost 11211'Obrigado por compartilhar isso! Bastante útil para depuração :) #
0190
por algum motivo grep -oe '[0-9] *' não funciona no iTerm2 no mac, teve que substituir por grep -Eo '[0-9] {1,99}'
max4ever
Isso é bacana, mas falta algumas teclas, alguma ideia do porquê?
user
14

Se você possui o PHP e o PHP-memcached instalados, pode executar

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
fonte
1
Você precisa fazer isso depois addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Para versões mais recentes do Memcached
hack4mer
Ainda assim, a resposta é bool (false) :-(
Wolfgang Blessen
2
@WolfgangBlessen - devido a um bug no memcached - foi corrigido nas versões mais recentes. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, eu realmente ver resultados agora e memcached está começando a ficar útil :-)
Wolfgang Blessen
12

Bash

Para obter a lista de chaves no Bash, siga estas etapas.

Primeiro, defina a seguinte função de invólucro para simplificar o uso (copiar e colar no shell):

function memcmd() {
  exec {memcache}<>/dev/tcp/localhost/11211
  printf "%s\n%s\n" "$*" quit >&${memcache}
  cat <&${memcache}
}

Memcached 1.4.31 e superior

Você pode usar o lru_crawler metadump allcomando para despejar (a maioria) dos metadados para (todos) os itens no cache.

Ao contrário cachedump, ele não causa problemas graves de desempenho e não tem limites na quantidade de chaves que podem ser despejadas.

Exemplo de comando usando a função definida anteriormente:

memcmd lru_crawler metadump all

Consulte: ReleaseNotes1431 .


Memcached 1.4.30 e abaixo

Obtenha uma lista de lajes usando o comando de estatísticas de itens , por exemplo:

memcmd stats items

Para cada classe de slub, é possível obter a lista de itens especificando o ID do slub junto com o número limite ( 0- ilimitado):

memcmd stats cachedump 1 0
memcmd stats cachedump 2 0
memcmd stats cachedump 3 0
memcmd stats cachedump 4 0
...

Nota: Você precisa fazer isso para cada servidor armazenado em cache.

Para listar todas as chaves de todos os stubs, aqui está o one-liner (por servidor):

for id in $(memcmd stats items | grep -o ":[0-9]\+:" | tr -d : | sort -nu); do
    memcmd stats cachedump $id 0
done

Nota: O comando acima pode causar sérios problemas de desempenho ao acessar os itens, portanto, não é aconselhável executar ao vivo.


Notas:

stats cachedumpapenas despeja o HOT_LRU(IIRC?), que é gerenciado por um encadeamento em segundo plano quando a atividade acontece. Isso significa que, em uma versão nova o suficiente, que o algo do 2T ativou, você obterá instantâneos do que está em apenas uma das LRUs.

Se você deseja visualizar tudo, lru_crawler metadump 1(ou lru_crawler metadump all) é o novo método com suporte oficial, que despeja assincronamente quantas chaves você deseja. você os deixará fora de ordem, mas atingirá todos os LRUs, e, a menos que você esteja excluindo / substituindo itens, várias execuções devem produzir os mesmos resultados.

Fonte: GH-405 .


Palavras-chave:

kenorb
fonte
5

A maneira mais fácil é usar o pacote python-memcached-stats, https://github.com/abstatic/python-memcached-stats

O método keys () deve ajudá-lo.

Exemplo -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
abhishek_M
fonte
1
Você pode até fazê-lo na linha de comando compython -m memcached_stats <ip> <port>
Martijn
1
Somente Python2, no momento.
Marius
Haverá algum limite em termos de número de chaves retornadas ou tamanho?
Loknath