174 votes

Obtenir toutes les clés définies dans Memcached

Comment puis-je obtenir toutes les clés définies dans mon instance(s) memcached ?

J'ai essayé de chercher sur Google, mais je n'ai pas trouvé grand-chose, sauf que PHP supporte une méthode getAllKeys, ce qui signifie qu'il est effectivement possible de le faire d'une manière ou d'une autre. Comment puis-je faire la même chose dans une session telnet ?

J'ai essayé toutes les options de récupération mentionnées dans la feuille de triche memcached et le résumé des commandes telnet Memcached, mais aucune d'entre elles ne fonctionne et je suis perdu pour trouver la bonne façon de le faire.

Remarque : Je fais actuellement cela en développement, donc on peut supposer qu'il n'y aura pas de problèmes dus à de nouvelles clés définies ou à d'autres conditions de concurrence, et le nombre de clés sera également limité.

231voto

mu 無 Points 8980

Je l'ai trouvé grâce au lien ici (avec la discussion originale du groupe google ici)

Tout d'abord, Telnet sur votre serveur:

telnet 127.0.0.1 11211

Ensuite, listez les éléments pour obtenir les identifiants de slab:

stats items
STAT items:3:number 1
STAT items:3:age 498
STAT items:22:number 1
STAT items:22:age 498
END

Le premier numéro après 'items' est l'identifiant de la slab. Demandez une extraction de cache pour chaque identifiant de slab, avec une limite pour le nombre maximal de clés à extraire:

stats cachedump 3 100
ITEM views.decorators.cache.cache\_header..cc7d9 \[6 b; 1256056128 s\]
END

stats cachedump 22 100
ITEM views.decorators.cache.cache\_page..8427e \[7736 b; 1256056128 s\]
END

82voto

kenorb Points 2464

memdump

Il y a une commande memcdump (parfois memdump) pour cela (faisant partie de libmemcached-tools), par exemple :

memcdump --servers=localhost

qui renverra toutes les clés.


memcached-tool

Dans la version récente de memcached il y a aussi la commande memcached-tool, par exemple.

memcached-tool localhost:11211 dump | less

qui fait une copie de toutes les clés et leurs valeurs.

Voir aussi :

22voto

OmarIthawi Points 1565

Sur la base de la réponse de @mu 無 ici. J'ai écrit un script de vidage de cache.

Le script décharge tout le contenu d'un serveur memcached. Il a été testé avec Ubuntu 12.04 et un memcached localhost, donc vos résultats peuvent varier.

#!/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'

Ce qu'il fait, c'est qu'il parcourt toutes les dalles de cache et affiche 1000 entrées de chacune.

Veuillez noter certaines limites de ce script, par exemple il peut ne pas être adapté à un serveur de cache de 5 Go. Mais il est utile à des fins de débogage sur une machine locale.

21voto

RousseauAlexandre Points 549

Si vous avez PHP et PHP-memcached installés, vous pouvez exécuter

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'

18voto

kenorb Points 2464

Bash

Pour obtenir la liste des clés en Bash, suivez les étapes suivantes.

Tout d'abord, définissez la fonction wrapper suivante pour simplifier son utilisation (copiez et collez dans shell) :

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

Memcached 1.4.31 et supérieur

Vous pouvez utiliser la commande lru_crawler metadump all pour obtenir le dump (la plupart) des métadonnées de (tous) les éléments dans le cache.

Contrairement à cachedump, cela ne cause pas de problèmes de performance graves et n'a aucune limite sur la quantité de clés qui peuvent être dump.

Exemple de commande en utilisant la fonction précédemment définie :

memcmd lru_crawler metadump all

Voir : ReleaseNotes1431.


Memcached 1.4.30 et inférieur

Obtenez la liste des fragments en utilisant la commande items statistics, par exemple :

memcmd stats items

Pour chaque classe de fragment, vous pouvez obtenir la liste des éléments en spécifiant l'identifiant de fragment ainsi que le nombre limite (0 - illimité) :

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

Note : Vous devez faire cela pour chaque serveur memcached.

Pour répertorier toutes les clés de tous les fragments, voici la commande en une seule ligne (par serveur) :

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

Note : La commande ci-dessus pourrait causer des problèmes de performances graves lors de l'accès aux éléments, il n'est donc pas conseillé de l'exécuter en direct.


Remarques :

stats cachedump ne fait que vider le HOT_LRU (si je me souviens bien ?), qui est géré par un thread en arrière-plan lorsque l'activité se produit. Cela signifie que sous une version suffisamment récente où l'algo 2Q est activé, vous obtiendrez des vues instantanées de ce qui se trouve dans un seul des LRU.

Si vous voulez tout voir, lru_crawler metadump 1 (ou lru_crawler metadump all) est la méthode la plus récente mostly-officially-supported qui videra de manière asynchrone autant de clés que vous le souhaitez. vous les obtiendrez hors de l'ordre mais cela touche tous les LRU, et à moins que vous ne supprimiez/remplaciez des éléments plusieurs exécutions devraient donner les mêmes résultats.

Source : GH-405.


Lié :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X