atur semua kunci di memcached

131

Bagaimana saya bisa mengatur semua kunci dalam instance memcached saya?

Saya mencoba googling, tetapi tidak menemukan banyak kecuali yang PHPmendukung getAllKeysmetode , yang berarti sebenarnya mungkin melakukan ini entah bagaimana. Bagaimana saya bisa mendapatkan yang sama dalam sesi telnet?

Saya telah mencoba semua opsi terkait pengambilan yang disebutkan dalam lembar contekan memcached dan ringkasan perintah telnet Memcached , tetapi tidak ada yang bekerja dan saya bingung untuk menemukan cara yang benar untuk melakukan ini.

Catatan: Saya sedang melakukan ini dalam pengembangan, sehingga dapat diasumsikan bahwa tidak akan ada masalah karena kunci baru diatur atau kondisi balapan lainnya terjadi, dan jumlah kunci juga akan terbatas.

mu 無
sumber
Periksa Posting saya . Saya memiliki masalah yang sama dan saya menemukan solusinya.
Peter VARGA
github.com/clickalicious/phpmemadmin terlihat membantu (jika saya dapat mengetahui cara membuatnya bekerja dengan Laravel Homestead Vagrant; saat ini tidak ada kunci yang terlihat).
Ryan

Jawaban:

178

Menemukan jalan, berkat tautan di sini (dengan diskusi grup google asli di sini )

Pertama, Telnetke server Anda:

telnet 127.0.0.1 11211

Berikutnya, daftar item untuk mendapatkan id pelat:

item statistik
STAT item: 3: nomor 1
STAT item: 3: usia 498
STAT item: 22: nomor 1
STAT item: 22: usia 498
AKHIR

Angka pertama setelah 'item' adalah id slab. Minta dump cache untuk setiap slab id, dengan batas jumlah kunci maksimum untuk dibuang:

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

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

mu 無
sumber
4
Harap dicatat bahwa statistik cachedump adalah fitur yang tidak berdokumen dan tidak didukung oleh tim memcached. Ini dimaksudkan untuk debugging saja dan tidak dimaksudkan untuk penggunaan produksi.
mikewied
Oh oke. Seperti yang saya katakan dalam pertanyaan saya, saya saat ini dalam mode pengembangan saja dan membutuhkan itu untuk debugging.
mu 無
3
badalah byte, sadalah detik waktu jaman
Abraham Sangha
1
@Dan Mungkin Anda melihat dengan jawaban aktif terlebih dahulu, yang mengurutkan posting jawaban berdasarkan kapan terakhir kali mereka melakukan aktivitas. Jika ya, Anda dapat mengubahnya dengan memilih salah satu yang aktif / terlama / suara dari tepat di bawah teks pertanyaan. Selain itu, jawaban ini ada di bagian atas dalam mode penyamaran.
mu 無
2
Ada juga lru_crawler metadump allyang akan membuang semua kunci cache, bukan "hanya" 1M pertama .. github.com/memcached/memcached/blob/…
Kaos
65

memdump

Ada memcdump(kadang-kadang memdump) perintah untuk itu (bagian dari libmemcached-tools), misalnya:

memcdump --servers=localhost

yang akan mengembalikan semua kunci.


memcached-tool

Dalam versi terbaru memcachedada juga memcached-toolperintah, misalnya

memcached-tool localhost:11211 dump | less

yang membuang semua kunci dan nilai.

Lihat juga:

kenorb
sumber
4
Hati-hati dengan 'memdump' perintah ini adalah cara yang bagus untuk crash terminal Anda.
deweydb
5
Cermat! The dumpsub-perintah untuk memcached-tooltampaknya untuk membersihkan cache :( --might lebih aman untuk digunakan displayatau statspertama.
MarkHu
4
Di Ubuntu Xenial, paket yang berisi memdump disebut libmemcached-tools, dan biner alat ini disebut memcdump.
thenickdude
5
Bagi mereka yang mencari memcached-toolitu agak tersembunyi di direktori, yang mungkin tidak dalam standar PATH- setidaknya di Ubuntu Xenial - sini:/usr/share/memcached/scripts/
sxc731
17

Berdasarkan jawaban @mu 無 di sini. Saya telah menulis skrip dump cache.

Script membuang semua konten dari server memcached. Ini diuji dengan Ubuntu 12.04 dan mem-host localhost, sehingga milage Anda dapat bervariasi.

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

Apa yang dilakukannya, ia melewati semua lempengan cache dan mencetak 1000 entri masing-masing.

Perlu diketahui batas-batas tertentu dari skrip ini, misalnya skrip ini mungkin tidak untuk server cache 5GB. Tapi ini berguna untuk keperluan debugging di mesin lokal.

Omar Al-Ithawi
sumber
3
Pada Debian 8 dengan memcached 1.4.21-1.1+deb8u1saya harus secara eksplisit mengirim perintah berhenti untuk memcached. Saya memodifikasi perintah Anda untuk ini dan berfungsi dengan baik sekarang: 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'Terima kasih telah berbagi ini! Cukup berguna untuk debugging :)
Cha0s
untuk beberapa alasan grep -oe '[0-9] *' tidak berfungsi di iTerm2 di mac, harus diganti dengan grep -Eo '[0-9] {1,99}'
max4ever
Ini bagus, tetapi kehilangan beberapa kunci, tahu mengapa?
pengguna
14

Jika Anda telah menginstal PHP & PHP-memcached, Anda dapat menjalankannya

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
sumber
1
Anda perlu melakukan ini setelah addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Untuk versi Memcached yang lebih baru
hack4mer
Masih jawabannya adalah bool (salah) :-(
Wolfgang Blessen
2
@ WolfgangBlessen - itu karena bug di memcached - itu diperbaiki dalam versi terbaru. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, saya benar-benar melihat hasil sekarang dan memcached mulai berguna :-)
Wolfgang Blessen
12

Pesta

Untuk mendapatkan daftar kunci di Bash, ikuti langkah-langkah ini.

Pertama, tentukan fungsi pembungkus berikut untuk membuatnya mudah digunakan (salin dan tempel ke shell):

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

Memcached 1.4.31 ke atas

Anda dapat menggunakan lru_crawler metadump allperintah untuk membuang (sebagian besar) metadata untuk (semua) item dalam cache.

Berbeda dengan cachedumpitu, itu tidak menyebabkan masalah kinerja yang parah dan tidak memiliki batasan pada jumlah kunci yang dapat dibuang.

Contoh perintah dengan menggunakan fungsi yang didefinisikan sebelumnya:

memcmd lru_crawler metadump all

Lihat: ReleaseNotes1431 .


Memcached 1.4.30 dan di bawah

Dapatkan daftar lempengan dengan menggunakan perintah statistik item , misalnya:

memcmd stats items

Untuk setiap kelas slub, Anda bisa mendapatkan daftar item dengan menentukan id slub bersama dengan nomor batas ( 0- tidak terbatas):

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

Catatan: Anda perlu melakukan ini untuk setiap server memcached.

Untuk daftar semua kunci dari semua bertopik, di sini adalah satu-liner (per satu server):

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

Catatan: Perintah di atas dapat menyebabkan masalah kinerja yang parah saat mengakses item, jadi tidak disarankan untuk dijalankan secara langsung.


Catatan:

stats cachedumphanya membuang HOT_LRU(IIRC?), yang dikelola oleh utas latar saat aktivitas terjadi. Ini berarti di bawah versi yang cukup baru dimana algo 2Q diaktifkan, Anda akan mendapatkan tampilan snapshot dari apa yang ada hanya di salah satu LRU.

Jika Anda ingin melihat semuanya, lru_crawler metadump 1(atau lru_crawler metadump all) adalah metode baru yang sebagian besar didukung secara resmi yang akan secara tidak sinkron membuang kunci sebanyak yang Anda inginkan. Anda akan mendapatkan mereka rusak tetapi hits semua LRU, dan kecuali jika Anda menghapus / mengganti item beberapa kali harus menghasilkan hasil yang sama.

Sumber: GH-405 .


Terkait:

kenorb
sumber
5

Cara termudah adalah dengan menggunakan paket python-memcached-stats, https://github.com/abstatic/python-memcached-stats

Metode keys () harus membantu Anda.

Contoh -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
abhishek_M
sumber
1
Anda bahkan dapat melakukannya dari baris perintah denganpython -m memcached_stats <ip> <port>
Martijn
1
Python2 saja, saat ini.
Marius
Apakah akan ada batasan dalam hal jumlah kunci yang dikembalikan atau ukuran?
loknath