memcachedに設定されているすべてのキーを取得する


131

memcachedインスタンスに設定されているすべてのキーを取得するにはどうすればよいですか?

私はグーグルで試しましたが、それがメソッドPHPサポートしていることを除いて多くは見つかりませんでした。Telnetセッションで同じようにするにはどうすればよいですか?getAllKeys

memcachedのチートシートMemcachedのtelnetコマンドの要約に記載されているすべての取得関連オプションを試してみましたが、どれも機能せず、正しい方法を見つけるのに途方に暮れています。

注:現在開発中であるため、新しいキーが設定されているなどの競合状態が発生しても問題は発生せず、キーの数も制限されると想定できます。


私の投稿を確認してください。同じ問題があり、解決策を見つけました。
Peter VARGA 2016

github.com/clickalicious/phpmemadminは役立つようです(Laravel Homestead Vagrantで動作させる方法がわかれば、現在、キーは表示されていません)。
ライアン

回答:


178

ここへのリンクのおかげで、方法が見つかりました(元のgoogleグループディスカッションはこちら

まず、Telnetサーバーに:

telnet 127.0.0.1 11211

次に、アイテムをリストしてスラブIDを取得します。

統計項目
STATアイテム:3:数値1
STATアイテム:3:498歳
STATアイテム:22:number 1
STATアイテム:22:498歳
終わり

'items'の後の最初の数字はスラブIDです。各スラブIDのキャッシュダンプをリクエストします。ダンプするキーの最大数に制限があります。

統計cachedump 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
終わり

統計cachedump 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
終わり


4
stats cachedumpは文書化されていない機能であり、memcachedチームではサポートされていないことに注意してください。これはデバッグのみを目的としており、実稼働での使用を目的としていません。
2013年

ああ。私の質問で述べたように、私は現在開発モードのみでデバッグのためにそれを必要としていました。
mu無

3
bバイト、sエポック時間秒
アブラハムサンガ

1
@Danたぶん、あなたは最初にアクティブな回答で表示しているかもしれません。はいの場合は、質問テキストのすぐ下からアクティブ/最も古い/投票のいずれかを選択することで、それを変更できます。それ以外は、この回答はシークレットモードでトップにあります。
mu無

2
またlru_crawler metadump all、最初の1Mだけではなく、すべてのキャッシュキーをダンプします。.github.com/memcached/memcached/blob/…
Kaos

65

memdump

そのためのmemcdump(時々memdump)コマンドがあります(の一部libmemcached-tools)、例えば:

memcdump --servers=localhost

すべてのキーを返します。


memcached-tool

最近のバージョンでmemcachedmemcached-tool、例えば、コマンドもあります

memcached-tool localhost:11211 dump | less

すべてのキーと値をダンプします。

以下も参照してください。


4
'memdump'に注意してこのコマンドを使用すると、端末をクラッシュさせることができます。
deweydb 2016

5
気をつけて!dump以下のためのサブコマンドは、memcached-toolキャッシュをクリアしているようだ:(使用に安全である--might displayまたはstats最初。
MarkHu

4
Ubuntu Xenialでは、memdumpを含むパッケージはと呼ばれlibmemcached-tools、ツールのバイナリは代わりにmemcdumpと呼ばれます。
thenickdude 2017

5
それを探してmemcached-toolいる人のために、標準ではないかもしれないディレクトリにいくらか隠されていますPATH-少なくともUbuntu Xenialでは-ここ:/usr/share/memcached/scripts/
sxc731

17

ここで@mu無回答に基づいてください。キャッシュダンプスクリプトを作成しました。

スクリプトは、memcachedサーバーのすべてのコンテンツをダンプします。Ubuntu 12.04とlocalhost memcachedでテストされているため、距離は異なる場合があります。

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

それが何をするか、それはすべてのキャッシュスラブを通過し、それぞれの1000エントリを出力します。

このスクリプトには特定の制限があることに注意してください。たとえば、5 GBのキャッシュサーバーでは拡張できない場合があります。ただし、ローカルマシンでのデバッグには役立ちます。


3
Debian 8ではmemcached 1.4.21-1.1+deb8u1、quitコマンドをmemcachedに明示的に送信する必要がありました。私はあなたのコマンドをこれに変更し、正しく動作します: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'これを共有してくれてありがとう!デバッグに非常に役立ちます:)
Cha0s 2017年

何らかの理由でgrep -oe '[0-9] *'はMac上のiTerm2では機能せず、grep -Eo '[0-9] {1,99}'と置き換える必要がありました
max4ever

これは気の利いた方法ですが、いくつかのキーがありません。
ユーザー

14

PHPとPHP-memcachedがインストールされている場合は、次を実行できます。

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

1
これは、addServerの後で行う必要があります。Memcachedの$c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); 新しいバージョンの場合
hack4mer

それでも答えはbool(false):-(
Wolfgang Blessen 2018

2
@WolfgangBlessen-memcachedのバグが原因です-これは最新バージョンで修正されています。 github.com/php-memcached-dev/php-memcached/issues/203
Billynoah

@billynoah Thx、実際に結果が表示され、memcachedが役立つようになりました:-)
Wolfgang Blessen 2018年

12

バッシュ

Bashのキーのリストを取得するには、次の手順に従います。

まず、次のラッパー関数を定義して、使いやすくします(コピーしてシェルに貼り付けます)。

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

Memcached 1.4.31以降

lru_crawler metadump allコマンドを使用して、キャッシュ内のアイテム(のすべて)のメタデータ(ほとんど)をダンプできます。

とは対照的にcachedump、重大なパフォーマンスの問題は発生せず、ダンプできるキーの量に制限はありません。

以前に定義した関数を使用したコマンドの例:

memcmd lru_crawler metadump all

参照:ReleaseNotes1431


Memcached 1.4.30以下

items statisticsコマンドを使用して、スラブのリストを取得します。例:

memcmd stats items

各スラブクラスについて、制限数(0-無制限)とともにスラブIDを指定することにより、アイテムのリストを取得できます。

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

注:memcachedサーバーごとにこれを行う必要があります。

すべてのスタブからすべてのキーをリストするために、1つのライナー(サーバーごとに)を次に示します。

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

注:上記のコマンドは、アイテムへのアクセス中に重大なパフォーマンスの問題を引き起こす可能性があるため、ライブで実行することはお勧めしません。


ノート:

stats cachedumpHOT_LRU(IIRC?)のみをダンプします。これは、アクティビティが発生したときにバックグラウンドスレッドによって管理されます。つまり、2Qアルゴが有効にした十分に新しいバージョンでは、LRUの1つだけにあるもののスナップショットビューが表示されます。

すべてを表示したい場合lru_crawler metadump 1(またはlru_crawler metadump all)は、ほぼ公式にサポートされている新しいメソッドで、必要な数のキーを非同期にダンプします。それらは順不同になりますが、すべてのLRUにヒットします。アイテムを削除または置換しない限り、複数の実行で同じ結果が得られます。

出典:GH-405


関連:


5

最も簡単な方法は、python-memcached-statsパッケージ、https://github.com/abstatic/python-memcached-statsを使用することです

keys()メソッドを使用すると、うまくいくはずです。

例-

from memcached_stats import MemcachedStats
mem = MemcachedStats()

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

1
コマンドラインからpython -m memcached_stats <ip> <port>
Martijn

1
現時点ではPython2のみ。
マリウス

返されるキーの数やサイズに制限はありますか?
loknath
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.