ottenere tutte le chiavi impostate in memcached


131

Come posso ottenere tutte le chiavi impostate nelle mie istanze memcached?

Ho provato a cercare su Google, ma non ho trovato molto, tranne che PHPsupporta un getAllKeysmetodo , il che significa che in realtà è possibile farlo in qualche modo. Come posso ottenere lo stesso in una sessione telnet?

Ho provato tutte le opzioni relative al recupero menzionate nel cheat sheet memcached e nel riepilogo dei comandi telc Memcached , ma nessuna di esse funziona e non riesco a trovare il modo corretto per farlo.

Nota: lo sto facendo attualmente in fase di sviluppo, quindi si può presumere che non ci saranno problemi dovuti all'impostazione di nuove chiavi o ad altre condizioni di gara simili, e anche il numero di chiavi sarà limitato.


Controlla il mio post . Ho avuto lo stesso problema e ho trovato una soluzione.
Peter VARGA,

github.com/clickalicious/phpmemadmin sembra utile (se riesco a capire come farlo funzionare con Laravel Homestead Vagrant; al momento non mostra chiavi).
Ryan,

Risposte:


178

Ho trovato un modo, grazie al link qui (con la discussione del gruppo google originale qui )

Innanzitutto, Telnetal tuo server:

telnet 127.0.0.1 11211

Quindi, elenca gli elementi per ottenere gli ID del solaio:

articoli stats
Voci STAT: 3: numero 1
Articoli STAT: 3: età 498
Voci STAT: 22: numero 1
Articoli STAT: 22: età 498
FINE

Il primo numero dopo "articoli" è l'ID del solaio. Richiedi un dump della cache per ogni ID slab, con un limite per il numero massimo di chiavi da scaricare:

stats memorizzato nella cache 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
FINE

stats memorizzato nella cache 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
FINE


4
Si noti che le statistiche memorizzate nella cache sono una funzionalità non documentata e non sono supportate dal team memcached. È destinato esclusivamente al debug e non è destinato all'uso in produzione.
mikewied,

Oh va bene. Come ho detto nella mia domanda, attualmente sono solo in modalità di sviluppo e ne avevo bisogno per il debug.
mu 無

3
bè byte, sè tempo di secondi secondi
Abraham Sangha,

1
@Dan Forse stai visualizzando per primo le risposte attive, che ordinano i post delle risposte in base all'ultima attività svolta. Se sì, puoi cambiarlo selezionando uno dei voti attivi / meno recenti / appena sotto il testo della domanda. A parte questo, questa risposta è al top in modalità di navigazione in incognito.
mu 無

2
C'è anche lru_crawler metadump allquello che scaricherà tutte le chiavi della cache, non "solo" il primo 1M .. github.com/memcached/memcached/blob/…
Kaos

65

memdump

C'è un comando memcdump(a volte memdump) per quello (parte di libmemcached-tools), ad esempio:

memcdump --servers=localhost

che restituirà tutte le chiavi.


memcached-tool

Nella versione recente di memcachedc'è anche il memcached-toolcomando, ad es

memcached-tool localhost:11211 dump | less

che scarica tutte le chiavi e i valori.

Guarda anche:


4
attenzione con 'memdump' questo comando è un ottimo modo per arrestare il tuo terminale.
Deweydb,

5
! attento Il dumpsottocomando per memcached-toolsembra svuotare la cache :( - potrebbe essere più sicuro da usare displayo statsprima.
MarkHu

4
In Ubuntu Xenial, viene chiamato il pacchetto che contiene memdump libmemcached-toolse invece il binario dello strumento si chiama memcdump.
thenickdude,

5
Per chi cerca memcached-toolè un po 'nascosto in una directory, che potrebbe non essere in uno standard PATH- almeno su Ubuntu Xenial - qui:/usr/share/memcached/scripts/
sxc731

17

Basati su @mu 無 rispondi qui. Ho scritto uno script di dump della cache.

Lo script scarica tutto il contenuto di un server memcached. È testato con Ubuntu 12.04 e un localhost memcached, quindi il tuo chilometraggio può variare.

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

Ciò che fa, passa attraverso tutte le lastre della cache e stampa 1000 voci di ciascuna.

Si prega di essere consapevoli di alcuni limiti di questo script, ad esempio potrebbe non adattarsi a un server cache da 5 GB, ad esempio. Ma è utile per scopi di debug su un computer locale.


3
Su Debian 8 con memcached 1.4.21-1.1+deb8u1ho dovuto inviare esplicitamente un comando quit a memcached. Ho modificato il tuo comando in questo e ora funziona correttamente: 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'grazie per averlo condiviso! Molto utile per il debug :)
Cha0s,

per qualche motivo grep -oe '[0-9] *' non funziona in iTerm2 su mac, ha dovuto sostituire grep -Eo '[0-9] {1,99}'
max4ever

Questo è elegante, ma manca alcune chiavi, hai idea del perché?
utente

14

Se hai PHP e PHP-memcached installati, puoi eseguirlo

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

1
Devi farlo dopo addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); per le versioni più recenti di Memcached
hack4mer

Comunque la risposta è bool (falso) :-(
Wolfgang Blessen,

2
@WolfgangBlessen - a causa di un bug nella memcached - è stato risolto nelle versioni più recenti. github.com/php-memcached-dev/php-memcached/issues/203
billynoah

@billynoah Grazie, vedo davvero i risultati ora e memcached sta iniziando a diventare utile :-)
Wolfgang Blessen

12

bash

Per ottenere un elenco di chiavi in ​​Bash, attenersi alla seguente procedura.

Innanzitutto, definisci la seguente funzione wrapper per renderla semplice da usare (copia e incolla nella shell):

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

Memcached 1.4.31 e versioni successive

È possibile utilizzare il lru_crawler metadump allcomando per scaricare (la maggior parte) dei metadati per (tutti) gli elementi nella cache.

Al contrario cachedump, non causa gravi problemi di prestazioni e non ha limiti sulla quantità di chiavi che è possibile scaricare.

Esempio di comando utilizzando la funzione precedentemente definita:

memcmd lru_crawler metadump all

Vedi: ReleaseNotes1431 .


Memcached 1.4.30 e precedenti

Ottieni un elenco di lastre utilizzando il comando statistiche articoli , ad esempio:

memcmd stats items

Per ogni classe slub, puoi ottenere un elenco di elementi specificando l'id slub insieme al numero limite ( 0- illimitato):

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

Nota: è necessario eseguire questa operazione per ciascun server memcached.

Per elencare tutte le chiavi di tutti gli stub, ecco il one-liner (per un server):

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

Nota: il comando sopra potrebbe causare gravi problemi di prestazioni durante l'accesso agli elementi, quindi non è consigliabile eseguire in diretta.


Appunti:

stats cachedumpesegue il dump di solo HOT_LRU(IIRC?), che viene gestito da un thread in background quando si verifica l'attività. Ciò significa che con una versione abbastanza nuova abilitata dall'algoritmo 2Q, otterrai una vista istantanea di ciò che è in una delle LRU.

Se vuoi vedere tutto, lru_crawler metadump 1(o lru_crawler metadump all) è il nuovo metodo per lo più supportato ufficialmente che scaricherà in modo asincrono tutte le chiavi che vuoi. li toglierai dall'ordine ma colpirà tutti gli LRU e, a meno che tu non stia eliminando / sostituendo gli articoli, più esecuzioni dovrebbero produrre gli stessi risultati.

Fonte: GH-405 .


Relazionato:


5

Il modo più semplice è usare il pacchetto python-memcached-stats, https://github.com/abstatic/python-memcached-stats

Il metodo keys () dovrebbe iniziare.

Esempio -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]

1
Puoi persino farlo dalla riga di comando conpython -m memcached_stats <ip> <port>
Martijn,

1
Solo Python2, al momento.
Marius,

Ci sarà un limite in termini di numero di chiavi restituite o dimensioni?
loknath,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.