memcached'de ayarlanan tüm anahtarları al


132

Memcached örneğimde ayarlanan tüm anahtarları nasıl alabilirim?

Googling'i denedim, ancak PHPbir yöntemi desteklemenin dışında pek bir şey bulamadımgetAllKeys , bu da aslında bunu bir şekilde yapmanın mümkün olduğu anlamına geliyor. Aynı şeyi bir telnet oturumunda nasıl alabilirim?

Memcached hile sayfasında ve Memcached telnet komut özetinde belirtilen geri alma ile ilgili tüm seçenekleri denedim , ancak hiçbiri çalışmıyor ve bunu yapmanın doğru yolunu bulmakta kayboldum.

Not: Şu anda bunu geliştirme aşamasında yapıyorum, bu nedenle yeni anahtarların ayarlanması veya bu tür diğer yarış koşullarından dolayı herhangi bir sorun olmayacağı ve anahtarların sayısının da sınırlı olacağı varsayılabilir.


Benim edin Yayınla . Aynı sorunu yaşadım ve bir çözüm buldum.
Peter VARGA

github.com/clickalicious/phpmemadmin yardımcı görünüyor (Laravel Homestead Vagrant ile nasıl çalıştırılacağını bulabilirsem; şu anda anahtar göstermiyor).
Ryan

Yanıtlar:


179

Buradaki bağlantı sayesinde bir yol buldum (buradaki orijinal google grup tartışması ile )

İlk olarak, Telnetsunucunuza:

telnet 127.0.0.1 11211

Ardından, döşeme kimliklerini almak için öğeleri listeleyin:

istatistik öğeleri
STAT öğeleri: 3: 1 numara
STAT öğeleri: 3: 498 yaş
STAT öğeleri: 22: 1 numara
STAT öğeleri: 22: 498 yaş
SON

"Öğeler" den sonraki ilk sayı döşeme kimliğidir. Her döşeme kimliği için bir önbellek dökümü isteyin ve maksimum dökümü anahtar sayısı sınırı:

istatistikler önbelleğe alınmış pompa 3100
ÖĞE views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
SON

istatistikler önbelleğe alınmış pompa 22100
ÖĞE views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
SON


4
Lütfen önbelleğe alınan istatistiklerin belgelenmemiş bir özellik olduğunu ve memcached ekibi tarafından desteklenmediğini unutmayın. Yalnızca hata ayıklama amaçlıdır ve üretim kullanımı için tasarlanmamıştır.
2013

Ah tamam. Sorumda söylediğim gibi, şu anda yalnızca geliştirme modundayım ve buna hata ayıklama için ihtiyacım vardı.
mu 無

3
bbayt, sçağ zamanı saniyedir
Abraham Sangha

1
@Dan Belki önce aktif cevaplara göre görüntülüyorsunuz, bu da cevap gönderilerini en son ne zaman etkinlik yaptıklarına göre sıralıyor. Evet ise, soru metninin hemen altındaki etkin / en eski / oylardan birini seçerek bunu değiştirebilirsiniz. Bunun dışında, bu cevap gizli modda en üstte.
mu 無

2
Ayrıca, lru_crawler metadump all"yalnızca" ilk 1 milyonu değil, tüm önbellek anahtarlarını boşaltacak
Kaos

65

memdump

Bunun için memcdump(bazen memdump) bir komut vardır (bir kısmı libmemcached-tools), örneğin:

memcdump --servers=localhost

tüm anahtarları döndürecektir.


memcached-tool

Son sürümünde komut memcachedda var memcached-tool, örneğin

memcached-tool localhost:11211 dump | less

tüm anahtarları ve değerleri döker.

Ayrıca bakınız:


4
'memdump'a dikkat edin, bu komut terminalinizi çökertmek için harika bir yoldur.
deweydb

5
Dikkatli! dumpİçin alt komut memcached-toolönbelleği temizlemek gibi görünüyor :( kullanımına daha güvenli --might displayveya statsilk.
MarkHu

4
Ubuntu Xenial'de memdump içeren paket çağrılır libmemcached-toolsve bunun yerine aracın ikili dosyası memcdump olarak adlandırılır.
thenickdude

5
memcached-toolBir dizinde biraz gizli arayanlar için , bu bir standartta olmayabilir PATH- en azından Ubuntu Xenial'de - burada:/usr/share/memcached/scripts/
sxc731

17

Burada @mu 無 cevabını temel alın . Bir önbellek dökümü komut dosyası yazdım.

Komut dosyası, memcached sunucusunun tüm içeriğini döker. Ubuntu 12.04 ve bir localhost memcached ile test edildi, bu yüzden milajınız değişebilir.

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

Ne yapar, tüm önbellek plakalarından geçer ve her birinden 1000 giriş yazdırır.

Lütfen bu komut dosyasının belirli sınırlarına dikkat edin, örneğin 5GB önbellek sunucusu için ölçeklenemeyebilir. Ancak yerel bir makinede hata ayıklama amacıyla kullanışlıdır.


3
Debian 8'de memcached 1.4.21-1.1+deb8u1memcached'e açıkça bir çıkış komutu göndermek zorunda kaldım. Komutunuzu buna göre değiştirdim ve şimdi düzgün çalışıyor: 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'Bunu paylaştığınız için teşekkürler! Hata ayıklama için oldukça kullanışlı :)
Cha0s

bazı nedenlerden dolayı grep -oe '[0-9] *' mac'teki iTerm2'de çalışmıyor, grep -Eo '[0-9] {1,99}' ile değiştirmek zorunda kaldı
max4ever

Bu şık, ama bazı anahtarları gözden kaçırıyor, neden olduğuna dair bir fikriniz var mı?
kullanıcı

14

PHP ve PHP-memcached kuruluysa, çalıştırabilirsiniz.

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

1
AddServer'dan sonra bunu yapmanız gerekir: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Memcached'in daha yeni sürümleri için
hack4mer

Yine de cevap bool (yanlış) :-(
Wolfgang Blessen

2
@WolfgangBlessen - bu memcached'deki bir hatadan kaynaklanıyor - en yeni sürümlerde düzeltildi. github.com/php-memcached-dev/php-memcached/issues/203
billynoah

@billynoah Thx, şimdi sonuçları gerçekten görüyorum ve memcached işe
yaramaya

12

darbe

Bash'deki anahtarların listesini almak için aşağıdaki adımları izleyin.

İlk olarak, kullanımı kolaylaştırmak için aşağıdaki sarmalayıcı işlevini tanımlayın (kabuğa kopyalayıp yapıştırın):

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

Memcached 1.4.31 ve üstü

lru_crawler metadump allÖnbellekteki öğelerin (tümü) meta verilerini dökmek için komutu (çoğu) kullanabilirsiniz .

Bunun tersine cachedump, ciddi performans sorunlarına neden olmaz ve atılabilecek anahtarların miktarı konusunda sınırlama yoktur.

Daha önce tanımlanan işlevi kullanarak örnek komut:

memcmd lru_crawler metadump all

Bakınız: ReleaseNotes1431 .


Memcached 1.4.30 ve altı

Öğe istatistikleri komutunu kullanarak döşeme listesini alın , örneğin:

memcmd stats items

Her bir şantuk sınıfı için, şantuk kimliğinin yanı sıra limit numarası ( 0- sınırsız) belirterek öğelerin listesini alabilirsiniz :

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

Not: Bunu memcached sunucularının her biri için yapmanız gerekir.

Tüm saplamalardaki tüm anahtarları listelemek için, işte tek satırlık (bir sunucu için):

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

Not: Yukarıdaki komut, öğelere erişirken ciddi performans sorunlarına neden olabilir, bu nedenle canlı olarak çalıştırılması önerilmez.


Notlar:

stats cachedumpyalnızca HOT_LRUetkinlik gerçekleşirken bir arka plan iş parçacığı tarafından yönetilen (IIRC?) 'yi döker . Bu, 2Q algo'nun etkinleştirdiği yeterince yeni bir sürüm altında, LRU'lardan yalnızca birinde olanların anlık görüntülerini alacağınız anlamına gelir.

Her şeyi görüntülemek istiyorsanız, lru_crawler metadump 1(veya lru_crawler metadump all), istediğiniz kadar çok sayıda anahtarı eşzamansız olarak dökecek, çoğunlukla resmi olarak desteklenen yeni yöntemdir. Bunları sıra dışı hale getireceksiniz, ancak tüm LRU'lara denk geliyor ve öğeleri silmediğiniz / değiştirmediğiniz sürece birden fazla çalıştırma aynı sonuçları vermelidir.

Kaynak: GH-405 .


İlişkili:


5

En kolay yol python-memcached-stats paketini kullanmaktır, https://github.com/abstatic/python-memcached-stats

Keys () yöntemi sizi harekete geçirmelidir.

Misal -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

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

1
Bunu komut satırından bile yapabilirsinizpython -m memcached_stats <ip> <port>
Martijn

1
Şu anda yalnızca Python2.
Marius

İade edilen anahtar sayısı veya boyutu açısından herhangi bir sınırlama olacak mı?
loknath
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.