obtener todas las claves establecidas en memcached

131

¿Cómo puedo obtener todas las claves establecidas en mi (s) instancia (s) de memcached?

Intenté buscar en Google, pero no encontré mucho, excepto que PHPadmite un getAllKeysmétodo , lo que significa que en realidad es posible hacer esto de alguna manera. ¿Cómo puedo obtener lo mismo dentro de una sesión de telnet?

He probado todas las opciones relacionadas con la recuperación mencionadas en la hoja de trucos memcached y el resumen del comando telca Memcached , pero ninguno de ellos funciona y no puedo encontrar la manera correcta de hacerlo.

Nota: Actualmente estoy haciendo esto en desarrollo, por lo que se puede suponer que no habrá problemas debido al establecimiento de nuevas claves u otras condiciones de carrera, y la cantidad de claves también será limitada.

mu 無
fuente
Revisa mi publicación . Tuve el mismo problema y encontré una solución.
Peter VARGA
github.com/clickalicious/phpmemadmin parece útil (si puedo descubrir cómo hacer que funcione con Laravel Homestead Vagrant; actualmente no muestra claves).
Ryan

Respuestas:

178

Encontré una manera, gracias al enlace aquí (con la discusión original del grupo de Google aquí )

Primero, Telneta su servidor:

telnet 127.0.0.1 11211

A continuación, enumere los elementos para obtener los identificadores de losa:

artículos de estadísticas
Elementos STAT: 3: número 1
Elementos STAT: 3: edad 498
Elementos STAT: 22: número 1
Artículos STAT: 22: edad 498
FINAL

El primer número después de 'elementos' es la identificación de losa. Solicite un volcado de caché para cada ID de losa, con un límite para el número máximo de claves para volcar:

stats cachedump 3 100
ARTÍCULO views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
FINAL

stats cachedump 22 100
ARTÍCULO views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
FINAL

mu 無
fuente
44
Tenga en cuenta que el caché de estadísticas es una característica no documentada y no es compatible con el equipo de memcached. Está destinado únicamente a la depuración y no está destinado para uso en producción.
mikewied
Oh ok Como dije en mi pregunta, actualmente solo estoy en modo de desarrollo y lo necesitaba para la depuración.
mu 無
3
bson bytes, sson segundos de tiempo de época
Abraham Sangha
1
@Dan Quizás esté viendo primero las respuestas activas, lo que clasifica las publicaciones de respuestas según la última vez que tuvieron actividad. En caso afirmativo, puede cambiar eso seleccionando uno de los votos activos / más antiguos / justo debajo del texto de la pregunta. Aparte de eso, esta respuesta está en la parte superior en modo incógnito.
mu 無
2
También hay lru_crawler metadump allque volcará todas las claves de caché, no "solo" el primer 1M .. github.com/memcached/memcached/blob/…
Kaos
65

memdump

Hay un comando memcdump(a veces memdump) para esa (parte de libmemcached-tools), por ejemplo:

memcdump --servers=localhost

que devolverá todas las llaves.


memcached-tool

En la versión reciente de memcachedhay también memcached-toolcomando, por ejemplo

memcached-tool localhost:11211 dump | less

que vuelca todas las claves y valores.

Ver también:

kenorb
fuente
44
cuidado con 'memdump', este comando es una excelente manera de bloquear su terminal.
deweydb
55
¡Cuidado! El dumpsubcomando para memcached-toolparece borrar el caché :( - podría ser más seguro de usar displayo statsprimero.
MarkHu
44
En Ubuntu Xenial, el paquete que contiene memdump se llama libmemcached-tools, y el binario de la herramienta se llama memcdump.
thenickdude
55
Para aquellos que buscan memcached-toolque está un poco escondida en un directorio, que no puede estar en un nivel PATH- por lo menos en Ubuntu Xenial - aquí:/usr/share/memcached/scripts/
sxc731
17

Base en @mu 無 responde aquí. He escrito un script de volcado de caché.

El script volca todo el contenido de un servidor memcached. Está probado con Ubuntu 12.04 y un host local memcached, por lo que su kilometraje puede 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'

Lo que hace es revisar todas las losas de caché e imprimir 1000 entradas de cada una.

Tenga en cuenta ciertos límites de este script, es decir, no puede escalar para un servidor de caché de 5 GB, por ejemplo. Pero es útil para propósitos de depuración en una máquina local.

Omar Al-Ithawi
fuente
3
En Debian 8 con memcached 1.4.21-1.1+deb8u1tuve que enviar explícitamente un comando de salida a memcached. Modifiqué tu comando a esto y funciona correctamente ahora: ¡ 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'Gracias por compartir esto! Bastante útil para la depuración :)
Cha0s
por alguna razón grep -oe '[0-9] *' no funciona en iTerm2 en mac, tuvo que reemplazar con grep -Eo '[0-9] {1,99}'
max4ever
Esto es ingenioso, pero pierde algunas claves, ¿alguna idea de por qué?
usuario
14

Si tiene instalado PHP y PHP-memcached, puede ejecutar

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
fuente
1
$c->setOption(Memcached::OPT_BINARY_PROTOCOL, false);
Debe
Aún así, la respuesta es bool (falso) :-(
Wolfgang Blessen
2
@WolfgangBlessen, debido a un error en memcached, se corrige en las versiones más recientes. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, realmente veo resultados ahora y memcached está empezando a ser útil :-)
Wolfgang Blessen
12

Intento

Para obtener una lista de claves en Bash, siga estos pasos.

Primero, defina la siguiente función de envoltura para que sea fácil de usar (copiar y pegar en el shell):

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

Memcached 1.4.31 y superior

Puede usar el lru_crawler metadump allcomando para volcar (la mayoría de) los metadatos de (todos) los elementos en el caché.

A diferencia de cachedump, no causa problemas graves de rendimiento y no tiene límites en la cantidad de claves que se pueden volcar.

Comando de ejemplo utilizando la función definida previamente:

memcmd lru_crawler metadump all

Ver: ReleaseNotes1431 .


Memcached 1.4.30 y menos

Obtenga una lista de losas utilizando el comando de estadísticas de elementos , por ejemplo:

memcmd stats items

Para cada clase de slub, puede obtener una lista de elementos especificando la identificación del slub junto con el número límite ( 0- ilimitado):

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

Nota: debe hacer esto para cada servidor memcached.

Para enumerar todas las claves de todos los apéndices, aquí tiene una línea (por servidor):

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

Nota: El comando anterior podría causar problemas graves de rendimiento al acceder a los elementos, por lo que no se recomienda ejecutarlo en vivo.


Notas:

stats cachedumpsolo vuelca el HOT_LRU(IIRC?), que es administrado por un subproceso en segundo plano a medida que ocurre la actividad. Esto significa que con una versión suficientemente nueva que habilitó el algoritmo 2Q, obtendrá vistas instantáneas de lo que hay en una de las LRU.

Si desea ver todo, lru_crawler metadump 1(o lru_crawler metadump all) es el nuevo método con soporte oficialmente mayoritario que volcará asincrónicamente tantas claves como desee. los sacará de servicio, pero afecta a todos los LRU y, a menos que esté eliminando / reemplazando elementos, varias ejecuciones deberían producir los mismos resultados.

Fuente: GH-405 .


Relacionado:

kenorb
fuente
5

La forma más fácil es usar el paquete python-memcached-stats, https://github.com/abstatic/python-memcached-stats

El método keys () debería ayudarlo.

Ejemplo

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
abhishek_M
fuente
1
Incluso puede hacerlo desde la línea de comandos conpython -m memcached_stats <ip> <port>
Martijn
1
Python2 solo, por el momento.
Marius
¿Habrá algún límite en cuanto al número de claves devueltas o el tamaño?
loknath