Alle Schlüssel in memcached setzen

131

Wie kann ich alle Schlüssel in meinen zwischengespeicherten Instanzen festlegen?

Ich habe versucht zu googeln, aber nicht viel gefunden, außer dass dies PHPeine getAllKeysMethode unterstützt , was bedeutet, dass es tatsächlich irgendwie möglich ist, dies zu tun. Wie kann ich innerhalb einer Telnet-Sitzung dasselbe erreichen?

Ich habe alle Optionen zum Abrufen ausprobiert, die in Memcached Cheat Sheet und Memcached Telnet Command Summary erwähnt sind , aber keine davon funktioniert, und ich bin ratlos, den richtigen Weg zu finden, um dies zu tun.

Hinweis: Ich mache dies derzeit in der Entwicklung, daher kann davon ausgegangen werden, dass es keine Probleme gibt, wenn neue Schlüssel gesetzt werden oder andere solche Rennbedingungen auftreten, und die Anzahl der Schlüssel wird ebenfalls begrenzt sein.

mu 無
quelle
Überprüfen Sie meinen Beitrag . Ich hatte das gleiche Problem und fand eine Lösung.
Peter VARGA
github.com/clickalicious/phpmemadmin sieht hilfreich aus (wenn ich herausfinden kann, wie es mit Laravel Homestead Vagrant funktioniert; derzeit werden keine Schlüssel angezeigt).
Ryan

Antworten:

178

Dank des Links hier einen Weg gefunden (mit der ursprünglichen Google-Gruppendiskussion hier )

Zunächst Telnetzu Ihrem Server:

telnet 127.0.0.1 11211

Listen Sie als Nächstes die Elemente auf, um die Platten-IDs zu erhalten:

Statistikelemente
STAT-Elemente: 3: Nummer 1
STAT-Artikel: 3: 498 Jahre
STAT-Elemente: 22: Nummer 1
STAT-Artikel: 22: 498 Jahre
ENDE

Die erste Zahl nach 'items' ist die Platten-ID. Fordern Sie für jede Slab-ID einen Cache-Dump an, wobei die maximale Anzahl der zu sichernden Schlüssel begrenzt ist:

stats cachedump 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
ENDE

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

mu 無
quelle
4
Bitte beachten Sie, dass der zwischengespeicherte Statistik-Speicher eine nicht dokumentierte Funktion ist und vom zwischengespeicherten Team nicht unterstützt wird. Es ist nur zum Debuggen gedacht und nicht für den Produktionsgebrauch.
mikewied
Oh ok. Wie ich in meiner Frage sagte, bin ich derzeit nur im Entwicklungsmodus und benötige dies zum Debuggen.
mu 無
3
bist Bytes, sist Epochenzeit Sekunden
Abraham Sangha
1
@Dan Vielleicht sehen Sie zuerst nach aktiven Antworten, wodurch die Antwortbeiträge danach sortiert werden, wann sie zuletzt aktiv waren. Wenn ja, können Sie dies ändern, indem Sie eine der aktiven / ältesten / Stimmen direkt unter dem Fragentext auswählen. Davon abgesehen steht diese Antwort im Inkognito-Modus ganz oben.
mu 無
2
Es gibt auch, lru_crawler metadump alldass alle Cache-Schlüssel ausgegeben werden, nicht "nur" die ersten 1M .. github.com/memcached/memcached/blob/…
Kaos
65

memdump

Es gibt einen memcdump(manchmal memdump) Befehl für diesen (Teil von libmemcached-tools), z.

memcdump --servers=localhost

Dadurch werden alle Schlüssel zurückgegeben.


memcached-tool

In der aktuellen Version von memcachedgibt es auch memcached-toolBefehl, z

memcached-tool localhost:11211 dump | less

Hiermit werden alle Schlüssel und Werte ausgegeben.

Siehe auch:

Kenorb
quelle
4
Vorsicht mit 'memdump' Dieser Befehl ist eine großartige Möglichkeit, Ihr Terminal zum Absturz zu bringen.
Deweydb
5
Vorsichtig! Der dumpUnterbefehl für memcached-toolscheint den Cache zu leeren :( - Könnte sicherer zu verwenden sein displayoder statszuerst.
MarkHu
4
In Ubuntu Xenial heißt das Paket, das memdump enthält libmemcached-tools, und die Binärdatei des Tools heißt stattdessen memcdump.
thenickdude
5
Für diejenigen, die danach suchen, ist memcached-tooles etwas versteckt in einem Verzeichnis, das möglicherweise nicht in einem Standard enthalten ist PATH- zumindest unter Ubuntu Xenial - hier:/usr/share/memcached/scripts/
sxc731
17

Basis ist @mu 無 antworte hier. Ich habe ein Cache-Dump-Skript geschrieben.

Das Skript gibt den gesamten Inhalt eines zwischengespeicherten Servers aus. Es wurde mit Ubuntu 12.04 und einem lokal gehosteten Host getestet, sodass Ihre Laufleistung variieren kann.

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

Was es tut, geht es durch alle Cache-Platten und druckt jeweils 1000 Einträge.

Bitte beachten Sie bestimmte Einschränkungen dieses Skripts, z. B. dass es möglicherweise nicht für einen 5-GB-Cache-Server skaliert werden kann. Es ist jedoch nützlich für Debugging-Zwecke auf einem lokalen Computer.

Omar Al-Ithawi
quelle
3
Auf Debian 8 mit musste memcached 1.4.21-1.1+deb8u1ich explizit einen Beendigungsbefehl an memcached senden. Ich habe Ihren Befehl dahingehend geändert und funktioniert jetzt ordnungsgemäß: 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'Vielen Dank, dass Sie dies geteilt haben!
Sehr
aus irgendeinem Grund funktioniert grep -oe '[0-9] *' in iTerm2 auf dem Mac nicht, musste durch grep -Eo '[0-9] {1,99}' ersetzt werden
max4ever
Das ist geschickt, aber es fehlen einige Schlüssel, eine Idee warum?
Benutzer
14

Wenn Sie PHP & PHP-memcached installiert haben, können Sie ausführen

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
quelle
1
Sie müssen dies nach addServer tun: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Für neuere Versionen von Memcached
hack4mer
Trotzdem lautet die Antwort bool (falsch) :-(
Wolfgang
2
@WolfgangBlessen - das liegt an einem Fehler in memcached - es ist in den neuesten Versionen behoben. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, ich sehe jetzt wirklich Ergebnisse und memcached wird langsam nützlich :-)
Wolfgang Blessen
12

Bash

Führen Sie die folgenden Schritte aus, um eine Liste der Schlüssel in Bash zu erhalten.

Definieren Sie zunächst die folgende Wrapper-Funktion, um die Verwendung zu vereinfachen (Kopieren und Einfügen in die Shell):

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

Memcached 1.4.31 und höher

Sie können verwenden lru_crawler metadump all Befehl (die meisten) Metadaten für (alle) Elemente im Cache sichern.

Im Gegensatz zu cachedump es keine schwerwiegenden Leistungsprobleme und hat keine Begrenzung für die Anzahl der Schlüssel, die ausgegeben werden können.

Beispielbefehl mit der zuvor definierten Funktion:

memcmd lru_crawler metadump all

Siehe: ReleaseNotes1431 .


Memcached 1.4.30 und darunter

Rufen Sie die Liste der Platten mit dem Befehl items statistics ab , z. B.:

memcmd stats items

Für jede Slub-Klasse können Sie eine Liste der Elemente abrufen, indem Sie die Slub-ID zusammen mit der Grenzwertnummer ( 0- unbegrenzt) angeben :

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

Hinweis: Sie müssen dies für jeden zwischengespeicherten Server tun.

Um alle Schlüssel von allen Stubs aufzulisten, ist hier der Einzeiler (pro Server):

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

Hinweis: Der obige Befehl kann beim Zugriff auf die Elemente schwerwiegende Leistungsprobleme verursachen. Es wird daher nicht empfohlen, ihn live auszuführen.


Anmerkungen:

stats cachedump wirft nur die HOT_LRUspeichert (IIRC?), das während der Aktivität von einem Hintergrundthread verwaltet wird. Dies bedeutet, dass Sie unter einer ausreichend neuen Version, die mit dem 2Q-Algo aktiviert wurde, Schnappschussansichten von nur einer der LRUs erhalten.

Wenn Sie alles anzeigen möchten, ist lru_crawler metadump 1(oder lru_crawler metadump all) die neue, meist offiziell unterstützte Methode, mit der so viele Schlüssel asynchron ausgegeben werden, wie Sie möchten. Sie werden sie außer Betrieb setzen, aber es trifft alle LRUs, und wenn Sie keine Elemente löschen / ersetzen, sollten mehrere Läufe die gleichen Ergebnisse liefern.

Quelle: GH-405 .


Verbunden:

Kenorb
quelle
5

Am einfachsten ist es, das Paket python-memcached-stats ( https://github.com/abstatic/python-memcached-stats) zu verwenden

Die keys () -Methode sollte Sie zum Laufen bringen.

Beispiel -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
abhishek_M
quelle
1
Sie können es sogar von der Kommandozeile aus mitpython -m memcached_stats <ip> <port>
Martijn
1
Im Moment nur Python2.
Marius
Wird es eine Begrenzung hinsichtlich der Anzahl der zurückgegebenen Schlüssel oder der Größe geben?
Loknath