obtenir toutes les clés définies dans memcached

131

Comment puis-je obtenir toutes les clés définies dans mes instances Memcached?

J'ai essayé googler, mais je n'ai pas trouvé grand-chose sauf que PHPprend en charge une getAllKeysméthode , ce qui signifie qu'il est en fait possible de le faire d'une manière ou d'une autre. Comment puis-je obtenir la même chose dans une session telnet?

J'ai essayé toutes les options liées à la récupération mentionnées dans la feuille de triche Memcached et le résumé de la commande Telnet Memcached , mais aucune d'elles ne fonctionne et je suis incapable de 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 à la définition de nouvelles clés ou à d'autres conditions de course similaires, et le nombre de clés sera également limité.

mu 無
la source
Vérifiez mon message . J'ai eu le même problème et j'ai trouvé une solution.
Peter VARGA
github.com/clickalicious/phpmemadmin semble utile (si je peux trouver comment le faire fonctionner avec Laravel Homestead Vagrant; actuellement, il n'affiche aucune clé).
Ryan

Réponses:

178

Trouvé un moyen, grâce au lien ici (avec la discussion de groupe google originale ici )

Tout d'abord, Telnetsur votre serveur:

telnet 127.0.0.1 11211

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

éléments de statistiques
Éléments STAT: 3: numéro 1
Articles STAT: 3: 498 ans
Articles STAT: 22: numéro 1
Articles STAT: 22 ans: 498 ans
FIN

Le premier chiffre après «items» est l'identifiant de la dalle. Demandez un vidage du cache pour chaque identifiant de dalle, avec une limite pour le nombre maximal de clés à vider:

stats cachedump 3100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
FIN

stats cachedump 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
FIN

mu 無
la source
4
Veuillez noter que stats cachedump est une fonctionnalité non documentée et n'est pas prise en charge par l'équipe memcached. Il est destiné uniquement au débogage et n'est pas destiné à une utilisation en production.
mikewied
Ah d'accord. Comme je l'ai dit dans ma question, je suis actuellement en mode développement uniquement et j'en ai besoin pour le débogage.
mu 無
3
best octets, sest époque secondes
Abraham Sangha
1
@Dan Peut-être que vous regardez d'abord par réponses actives, ce qui trie les messages de réponse en fonction de leur dernière activité. Si oui, vous pouvez changer cela en sélectionnant l'un des votes actifs / plus anciens / juste en dessous du texte de la question. À part cela, cette réponse est au sommet en mode navigation privée.
mu 無
2
Il y a aussi lru_crawler metadump allqui videra toutes les clés de cache, pas "seulement" le premier 1M .. github.com/memcached/memcached/blob
Kaos
65

memdump

Il existe une commande memcdump(parfois memdump) pour cette (partie de libmemcached-tools), par exemple:

memcdump --servers=localhost

qui renverra toutes les clés.


memcached-tool

Dans la version récente de, memcachedil existe également une memcached-toolcommande, par exemple

memcached-tool localhost:11211 dump | less

qui vide toutes les clés et valeurs.

Voir également:

Kenorb
la source
4
attention avec 'memdump' cette commande est un excellent moyen de planter votre terminal.
deweydb
5
Prudent! La dumpsous-commande pour memcached-toolsemble vider le cache :( - pourrait être plus sûr à utiliser displayou d' statsabord.
MarkHu
4
Dans Ubuntu Xenial, le package qui contient memdump est appelé libmemcached-tools, et le binaire de l'outil est appelé memcdump à la place.
thenickdude
5
Pour ceux qui recherchent memcached-toolil est quelque peu caché dans un répertoire, qui n'est peut-être pas dans un standard PATH- du moins sur Ubuntu Xenial - ici:/usr/share/memcached/scripts/
sxc731
17

Basé sur @mu 無, répondez ici. J'ai écrit un script de vidage de cache.

Le script vide tout le contenu d'un serveur Memcached. Il est testé avec Ubuntu 12.04 et un hôte local memcached, donc votre kilométrage peut 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, il parcourt toutes les dalles de cache et imprime 1000 entrées de chacune.

Veuillez noter certaines limites de ce script, c'est-à-dire qu'il peut ne pas évoluer pour un serveur de cache de 5 Go par exemple. Mais c'est utile à des fins de débogage sur une machine locale.

Omar Al-Ithawi
la source
3
Sur Debian 8 avec, memcached 1.4.21-1.1+deb8u1j'ai dû envoyer explicitement une commande quit à memcached. J'ai modifié votre commande et fonctionne correctement maintenant: 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'Merci de partager ceci! Très utile pour le débogage :)
Cha0s
pour une raison quelconque, grep -oe '[0-9] *' ne fonctionne pas dans iTerm2 sur mac, a dû être remplacé par grep -Eo '[0-9] {1,99}'
max4ever
C'est chouette, mais il manque quelques clés, une idée pourquoi?
utilisateur
14

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

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
la source
1
Vous devez le faire après addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Pour les versions plus récentes de Memcached
hack4mer
Toujours la réponse est bool (faux) :-(
Wolfgang Blessen
2
@WolfgangBlessen - cela est dû à un bogue dans Memcached - il est corrigé dans les dernières versions. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, je vois vraiment des résultats maintenant et memcached commence à devenir utile :-)
Wolfgang Blessen
12

Frapper

Pour obtenir la liste des clés dans Bash, procédez comme suit.

Tout d'abord, définissez la fonction wrapper suivante pour la rendre simple à utiliser (copier et coller dans le 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 lru_crawler metadump allcommande pour vider (la plupart des) métadonnées pour (tous) les éléments dans le cache.

Par opposition à cachedump, il ne cause pas de problèmes de performances graves et n'a pas de limites sur le nombre de clés pouvant être vidées.

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 dalles en utilisant la commande de statistiques d'éléments , par exemple:

memcmd stats items

Pour chaque classe de slub, vous pouvez obtenir la liste des éléments en spécifiant l'ID de slub avec 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
...

Remarque: vous devez effectuer cette opération pour chaque serveur Memcached.

Pour lister toutes les clés de tous les stubs, voici le one-liner (pour un serveur):

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

Remarque: la commande ci-dessus peut entraîner de graves problèmes de performances lors de l'accès aux éléments, il n'est donc pas conseillé de l'exécuter en direct.


Remarques:

stats cachedumpne HOT_LRUvide que le (IIRC?), qui est géré par un thread d'arrière-plan lorsque l'activité se produit. Cela signifie que sous une version suffisamment nouvelle que l'algo 2Q a activé, vous obtiendrez des vues instantanées de ce qui se trouve dans un seul des LRU.

Si vous voulez tout afficher, lru_crawler metadump 1(ou lru_crawler metadump all) est la nouvelle méthode principalement officiellement prise en charge qui videra de manière asynchrone autant de clés que vous le souhaitez. vous les obtiendrez dans le désordre 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 .


En relation:

Kenorb
la source
5

Le moyen le plus simple est d'utiliser le package python-memcached-stats, https://github.com/abstatic/python-memcached-stats

La méthode keys () devrait vous permettre de démarrer.

Exemple -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
abhishek_M
la source
1
Vous pouvez même le faire à partir de la ligne de commande avecpython -m memcached_stats <ip> <port>
Martijn
1
Python2 uniquement, pour le moment.
Marius
Y aura-t-il une limite en termes de nombre de clés retournées ou de taille?
loknath