получить все ключи, установленные в memcached

132

Как я могу получить все ключи, установленные в моем экземпляре (ах) memcached?

Я пробовал поискать в Google, но ничего не нашел, кроме того, что PHPподдерживает getAllKeysметод , а это значит, что это действительно можно как-то сделать. Как я могу получить то же самое в сеансе Telnet?

Я опробовал все параметры, связанные с извлечением, упомянутые в памятке по memcached и сводке команд Telnet в Memcached , но ни один из них не работает, и я не могу найти правильный способ сделать это.

Примечание. В настоящее время я занимаюсь этим в стадии разработки, поэтому можно предположить, что не возникнет проблем из-за установки новых ключей или возникновения других подобных состояний гонки, а количество ключей также будет ограничено.

mu 無
источник
Проверьте мой пост . У меня была такая же проблема, и я нашел решение.
Питер ВАРГА
github.com/clickalicious/phpmemadmin выглядит полезным (если я смогу понять, как заставить его работать с Laravel Homestead Vagrant; в настоящее время он не показывает ключей).
Ryan

Ответы:

179

Нашел способ, благодаря ссылке здесь (с оригинальным обсуждением группы google здесь )

Сначала Telnetна ваш сервер:

telnet 127.0.0.1 11211

Затем перечислите элементы, чтобы получить идентификаторы плит:

элементы статистики
Статистические элементы: 3: номер 1
Статистические данные: 3: возраст 498
Статистические элементы: 22: номер 1
Статистические данные: 22: возраст 498
КОНЕЦ

Первое число после «items» - это идентификатор плиты. Запросить дамп кеша для каждого идентификатора плиты с ограничением максимального количества ключей для дампа:

статистика кешируется 3100
ПУНКТ views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 с]
КОНЕЦ

статистика кешируется 22 100
ПУНКТ views.decorators.cache.cache_page..8427e [7736 b; 1256056128 с]
КОНЕЦ

mu 無
источник
4
Обратите внимание, что cachedump статистики - это недокументированная функция, которая не поддерживается командой memcached. Он предназначен только для отладки и не предназначен для производственного использования.
mikewied
Ну ладно. Как я уже сказал в своем вопросе, в настоящее время я нахожусь только в режиме разработки и мне это нужно для отладки.
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

В последней версии memcachedтакже есть memcached-toolкоманда, например

memcached-tool localhost:11211 dump | less

который сбрасывает все ключи и значения.

Смотрите также:

kenorb
источник
4
осторожно с memdump, эта команда - отличный способ вывести из строя ваш терминал.
deweydb
5
Осторожный! dumpСуб-команда для memcached-toolпохоже , чтобы очистить кэш :( --might безопаснее использовать displayили statsпервый.
MarkHu
4
В Ubuntu Xenial вызывается пакет, содержащий memdump libmemcached-tools, а вместо этого двоичный файл инструмента называется memcdump.
thenickdude
5
Для тех, кто ищет, memcached-toolэто несколько скрыто в каталоге, который может не входить в стандарт PATH- по крайней мере, в Ubuntu Xenial - здесь:/usr/share/memcached/scripts/
sxc731 06
17

На основе @mu 無 ответьте здесь. Я написал сценарий дампа кеша.

Скрипт выгружает все содержимое сервера memcached. Он протестирован с Ubuntu 12.04 и memcached localhost, поэтому ваш пробег может отличаться.

#!/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 ГБ. Но это полезно для отладки на локальном компьютере.

Омар Аль-Итави
источник
3
В Debian 8 memcached 1.4.21-1.1+deb8u1мне приходилось явно отправлять команду выхода в 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
по какой-то причине grep -oe '[0-9] *' не работает в iTerm2 на Mac, пришлось заменить на grep -Eo '[0-9] {1,99}'
max4ever
Это здорово, но в нем не хватает некоторых клавиш, есть идеи, почему?
пользователь
14

Если у вас установлены PHP и PHP-memcached, вы можете запустить

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
RousseauAlexandre
источник
1
Это нужно сделать после addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); для более новых версий Memcached
hack4mer
Тем не менее ответ - bool (false) :-(
Wolfgang Blessen
2
@WolfgangBlessen - это из-за ошибки в memcached - она ​​исправлена ​​в последних версиях. github.com/php-memcached-dev/php-memcached/issues/203
billynoah
@billynoah Thx, теперь я действительно вижу результаты, и memcached начинает становиться полезным :-)
Вольфганг Блессен
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 и ниже

Получите список плит с помощью команды статистики элементов , например:

memcmd stats items

Для каждого класса slub вы можете получить список элементов, указав идентификатор slub вместе с ограниченным числом ( 0- неограниченно):

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

Примечание: вам нужно сделать это для каждого сервера memcached.

Чтобы перечислить все ключи из всех заглушек, вот однострочный (на один сервер):

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

Примечание. Приведенная выше команда может вызвать серьезные проблемы с производительностью при доступе к элементам, поэтому не рекомендуется запускать ее в реальном времени.


Ноты:

stats cachedumpсбрасывает только HOT_LRU(IIRC?), который управляется фоновым потоком по мере выполнения активности. Это означает, что в достаточно новой версии, в которой включен алгоритм 2Q, вы получите снимки того, что находится только в одном из LRU.

Если вы хотите просмотреть все, lru_crawler metadump 1(или lru_crawler metadump all) - это новый, в основном официально поддерживаемый метод, который будет асинхронно сбрасывать столько ключей, сколько вы хотите. вы получите их не по порядку, но он попадает во все LRU, и, если вы не удаляете / не заменяете элементы, несколько запусков должны дать одинаковые результаты.

Источник: GH-405 .


Связанный:

kenorb
источник
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',
 ... ]
abhishek_M
источник
1
Вы даже можете сделать это из командной строки с помощьюpython -m memcached_stats <ip> <port>
Martijn
1
На данный момент только Python2.
Мариус
Будет ли какое-то ограничение на количество или размер возвращаемых ключей?
loknath