pobierz wszystkie klucze ustawione w memcached


134

Jak mogę uzyskać wszystkie klucze ustawione w moich instancjach memcached?

Próbowałem googlować, ale nie znalazłem wiele poza tym, że PHPobsługuje getAllKeysmetodę , co oznacza, że ​​w rzeczywistości można to jakoś zrobić. Jak mogę uzyskać to samo w sesji telnet?

Wypróbowałem wszystkie opcje związane z pobieraniem, o których mowa w ściągawce memcached i podsumowaniu poleceń telnet Memcached , ale żadna z nich nie działa i nie mogę znaleźć właściwego sposobu na zrobienie tego.

Uwaga: obecnie robię to w fazie rozwoju, więc można założyć, że nie będzie żadnych problemów z powodu ustawiania nowych kluczy lub innych podobnych warunków wyścigu, a liczba kluczy również będzie ograniczona.


Sprawdź mój post . Miałem ten sam problem i znalazłem rozwiązanie.
Peter VARGA

github.com/clickalicious/phpmemadmin wygląda pomocnie (jeśli mogę dowiedzieć się, jak sprawić, by działał z Laravel Homestead Vagrant; obecnie nie wyświetla żadnych kluczy).
Ryan,

Odpowiedzi:


181

Znalazłem sposób, dzięki linkowi tutaj (z oryginalną dyskusją grupy Google tutaj )

Najpierw Telnetna twój serwer:

telnet 127.0.0.1 11211

Następnie wypisz elementy, aby uzyskać identyfikatory płyty:

statystyki
Pozycje STAT: 3: numer 1
Elementy STAT: 3: wiek 498
Pozycje STAT: 22: numer 1
Elementy STAT: 22: wiek 498
KONIEC

Pierwsza liczba po „pozycji” to identyfikator płyty. Poproś o zrzut pamięci podręcznej dla każdego identyfikatora płyty, z ograniczeniem maksymalnej liczby kluczy do zrzucenia:

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

stats cachedump 22100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
KONIEC


4
Pamiętaj, że stats cachedump jest nieudokumentowaną funkcją i nie jest obsługiwany przez zespół memcached. Jest przeznaczony tylko do debugowania i nie jest przeznaczony do użytku produkcyjnego.
mikewied

OK. Jak powiedziałem w swoim pytaniu, jestem obecnie w trybie programistycznym i potrzebuję go do debugowania.
mu 無

3
bto bajty, sto epoka czas sekundy
Abraham Sangha

1
@Dan Być może najpierw przeglądasz według aktywnych odpowiedzi, które sortują posty z odpowiedziami na podstawie czasu ostatniej aktywności. Jeśli tak, możesz to zmienić, wybierając jeden z aktywnych / najstarszych / głosów bezpośrednio pod tekstem pytania. Poza tym ta odpowiedź jest na górze w trybie incognito.
mu 無

3
Jest też to, lru_crawler metadump allże zrzuci wszystkie klucze pamięci podręcznej, a nie „tylko” pierwszy 1M .. github.com/memcached/memcached/blob/
Kaos

66

memdump

Jest do tego memcdump(czasami memdump) polecenie (część libmemcached-tools), np .:

memcdump --servers=localhost

która zwróci wszystkie klucze.


memcached-tool

W najnowszej wersji memcachedjest też memcached-toolpolecenie, np

memcached-tool localhost:11211 dump | less

który zrzuca wszystkie klucze i wartości.

Zobacz też:


4
ostrożnie z 'memdump' to polecenie to świetny sposób na zawieszenie terminala.
deweydb

6
Ostrożny! Polecenie dumppodrzędne dla memcached-toolwydaje się czyścić pamięć podręczną :( - może być bezpieczniejsze w użyciu displaylub statspierwsze.
MarkHu

4
W Ubuntu Xenial pakiet zawierający memdump jest nazywany libmemcached-tools, a plik binarny narzędzia nazywa się memcdump.
thenickdude

5
Dla tych, którzy szukają memcached-tool, jest nieco ukryty w katalogu, który może nie być w standardzie PATH- przynajmniej na Ubuntu Xenial - tutaj:/usr/share/memcached/scripts/
sxc731

17

Bazuj na odpowiedzi @mu 無tutaj. Napisałem skrypt zrzutu pamięci podręcznej.

Skrypt zrzuca całą zawartość serwera memcached. Jest testowany z Ubuntu 12.04 i localhost memcached, więc Twój przebieg może się różnić.

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

Co robi, przechodzi przez wszystkie płyty pamięci podręcznej i drukuje 1000 wpisów z każdego.

Należy pamiętać o pewnych ograniczeniach tego skryptu, np. Może nie być skalowany dla serwera z pamięcią podręczną 5 GB. Ale jest to przydatne do debugowania na komputerze lokalnym.


3
W Debianie 8 memcached 1.4.21-1.1+deb8u1musiałem jawnie wysłać polecenie wyjścia do memcached. Zmodyfikowałem twoje polecenie do tego i teraz działa poprawnie: 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'Dzięki za udostępnienie tego! Całkiem przydatne do debugowania :)
Cha0s

z jakiegoś powodu grep -oe '[0-9] *' nie działa w iTerm2 na Macu, musiałem zastąpić grep -Eo '[0-9] {1,99}'
max4ever

To fajne, ale brakuje niektórych kluczy, jakiś pomysł dlaczego?
użytkownik

15

Jeśli masz zainstalowane PHP i PHP-memcached, możesz uruchomić

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

1
Musisz to zrobić po addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Dla nowszych wersji Memcached
Anand Singh

Wciąż odpowiedź brzmi bool (fałsz) :-(
Wolfgang Blessen

2
@WolfgangBlessen - to z powodu błędu w memcached - zostało to naprawione w najnowszych wersjach. github.com/php-memcached-dev/php-memcached/issues/203
billynoah

@billynoah Dzięki, teraz naprawdę widzę wyniki, a memcached zaczyna być przydatny :-)
Wolfgang Blessen

13

Grzmotnąć

Aby uzyskać listę kluczy w Bash, wykonaj następujące kroki.

Najpierw zdefiniuj następującą funkcję opakowującą, aby była prosta w użyciu (kopiowanie i wklejanie do powłoki):

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

Memcached 1.4.31 i nowsze

Możesz użyć lru_crawler metadump allpolecenia, aby zrzucić (większość) metadanych dla (wszystkich) elementów w pamięci podręcznej.

W przeciwieństwie do cachedumptego nie powoduje poważnych problemów z wydajnością i nie ma ograniczeń co do liczby kluczy, które można zrzucić.

Przykładowe polecenie przy użyciu wcześniej zdefiniowanej funkcji:

memcmd lru_crawler metadump all

Zobacz: ReleaseNotes1431 .


Memcached 1.4.30 i starsze

Pobierz listę płyt za pomocą polecenia statystyki przedmiotów , np .:

memcmd stats items

Dla każdej klasy slub możesz uzyskać listę przedmiotów, podając identyfikator slub wraz z liczbą limitów ( 0- nieograniczona):

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

Uwaga: Musisz to zrobić dla każdego serwera memcached.

Aby wyświetlić wszystkie klucze ze wszystkich kodów pośredniczących, oto jedna linijka (na jeden serwer):

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

Uwaga: powyższe polecenie może spowodować poważne problemy z wydajnością podczas uzyskiwania dostępu do elementów, dlatego nie zaleca się uruchamiania na żywo.


Uwagi:

stats cachedumpzrzuca tylko HOT_LRU(IIRC?), który jest zarządzany przez wątek w tle w miarę działania. Oznacza to, że w wystarczająco nowej wersji, w której włączony jest algorytm 2Q, otrzymasz migawki tego, co jest w jednym z LRU.

Jeśli chcesz zobaczyć wszystko, lru_crawler metadump 1(lub lru_crawler metadump all) jest to nowa, głównie oficjalnie obsługiwana metoda, która asynchronicznie zrzuca tyle kluczy, ile chcesz. wydostaniesz je z porządku, ale trafi to we wszystkie LRU, i jeśli nie usuwasz / wymieniasz elementów, wiele przebiegów powinno dawać takie same wyniki.

Źródło: GH-405 .


Związane z:


5

Najłatwiej jest użyć pakietu python-memcached-stats, https://github.com/abstatic/python-memcached-stats

Metoda keys () powinna Cię uruchomić.

Przykład -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

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

1
Możesz to nawet zrobić z wiersza poleceń za pomocąpython -m memcached_stats <ip> <port>
Martijn

1
W tej chwili tylko Python2.
Marius

Czy będzie ograniczenie liczby zwracanych kluczy lub rozmiaru?
loknath
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.