Desenvolvimento

11 set, 2013

Lendo todos os dados de uma instância Memcached

Publicidade

Memcached é simplesmente um armazenamento chave/valor, muitas vezes usado como um cache para reduzir a carga em um sistema de banco de dados. Ele usa um conceito de slabs e chunks para armazenar dados. Cada parte dos dados que você deseja armazenar, dependendo do tamanho do objeto, ficará armazenada em uma slab diferente. A slab é fixa em tamanho e irá armazenar seus dados.

Memcached permite recuperar todos os dados a partir da linha de comando (= interface telnet).

Agora, assumindo que o seu telnet está sendo executado em ‘localhost’ na porta padrão 11211, você pode acessar a interface telnet na linha de comando desse modo.

$ telnet localhost 11211

Agora você entrou na interface CLI Memcached. Para começar, execute um comando stats para mostrar a você quantos slabs ativos existem.

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
...
STAT 28:cas_hits 0
STAT 28:cas_badval 0
STAT active_slabs 22

Cada slab irá mostrar-lhe as estatísticas de uso (ótimo para monitoramento de cada slab, por sinal!), bem como a identificação numérica para cada um desses slabs. Essas IDs são necessárias para obter todos os dados a partir de um slab.

Por exemplo, para obter todos os dados do primeiro slab, use o seguinte comando CLI. Note que o primeiro dígito é a ID numérica do slab, e o segundo dígito é o número de itens que você deseja recuperar. Zero (= 0) significa todos os itens.

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats cachedump 1 0
ITEM cache-.wildcard-locale%3A [2 b; 1367247294 s]

Nesse caso, na slab de ID 1, há um item encontrado chamado “cache-.wildcard-locale” (esse é um cache Drupal), com o valor próximo a ele.

Alguns slabs terão mais itens do que outros.

$ telnet localhost 11211
...
stats cachedump 5 0
ITEM cache_field-field%3Auser%3A1 [144 b; 1367247294 s]
ITEM cache_path-admin%2Fstructure [140 b; 1367247294 s]
ITEM cache_path-admin%2Fappearance [141 b; 1367247294 s]
ITEM cache_field-field%3Anode%3A9 [145 b; 1367247294 s]
ITEM cache_field-field%3Anode%3A4 [145 b; 1367247294 s]
ITEM cache_path-node%2F35%2Fedit [131 b; 1367247294 s]
ITEM cache_path-node%2F32%2Fedit [131 b; 1367247294 s]
ITEM cache_path-node%2F30%2Fedit [131 b; 1367247294 s]

Percorra cada item e faça um “stats cachedump $ID 0”, e você verá todos os dados.

Agora, se você não quer um telnet de cada vez, você pode enganar um pouco com esse simples linha.

$ echo "stats cachedump 5 0" | nc localhost 11211
ITEM cache_field-field%3Auser%3A1 [144 b; 1367247294 s]
ITEM cache_path-admin%2Fstructure [140 b; 1367247294 s]
ITEM cache_path-admin%2Fappearance [141 b; 1367247294 s]
ITEM cache_field-field%3Anode%3A9 [145 b; 1367247294 s]
ITEM cache_field-field%3Anode%3A4 [145 b; 1367247294 s]
ITEM cache_path-node%2F35%2Fedit [131 b; 1367247294 s]
ITEM cache_path-node%2F32%2Fedit [131 b; 1367247294 s]
ITEM cache_path-node%2F30%2Fedit [131 b; 1367247294 s]

Ela exige apenas o seu canivete suíço para networking: NetCat (= nc).

***

Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://mattiasgeniar.be/2013/05/29/reading-all-data-from-a-memcached-instance/