отримати всі ключі в пам'яті


131

Як я можу отримати всі ключі, встановлені в моїх запам'ятовуваних екземплярах?

Я спробував googling, але не знайшов багато, крім того, що PHPпідтримує getAllKeysметод , а це означає, що це реально зробити якось. Як я можу отримати те саме в сесії telnet?

Я випробував усі параметри, пов’язані із пошуком, згадані в складеному аркуші чіт-листів та підсумках команд Memcached telnet , але жоден з них не працює, і я втрачаю можливість знайти правильний спосіб зробити це.

Примітка. Зараз я це роблю в розробці, тому можна припустити, що проблем не буде через встановлення нових клавіш або інших подібних умов перегонів, а кількість ключів також буде обмежена.


Перевірте мій пост . У мене була така ж проблема, і я знайшов рішення.
Пітер ВАРГА

github.com/clickalicious/phpmemadmin виглядає корисним (якщо я можу зрозуміти, як змусити його працювати з Laravel Homestead Vagrant; на даний момент він не показує ключів).
Райан

Відповіді:


178

Знайшли спосіб завдяки посиланню тут (з оригінальною дискусією в групі Google )

По-перше, Telnetна ваш сервер:

telnet 127.0.0.1 11211

Далі перелічіть елементи, щоб отримати ідентифікатори плит:

статистика елементів
Пункти ДАТ: 3: номер 1
Елементи СТАТ: 3: вік 498 років
Елементи ДАТ: 22: номер 1
Елементи ДЕРЖ: 22: вік 498
Кінець

Перше число після "елементів" - це ідентифікатор планки. Попросити скинути кеш-пам'ять для кожного ідентифікатора плати з обмеженням для максимальної кількості клавіш для скидання:

статистика кешованих 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 с]
Кінець

статистика кешованих 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 с]
Кінець


4
Зауважте, що кеш-пам’ять статистики - це недокументована функція і не підтримується командою, що запам'ятовується. Він призначений лише для налагодження і не призначений для використання у виробництві.
mikewied

О, добре. Як я вже говорив у своєму запитанні, наразі я перебуваю лише в режимі розробки і мені це потрібно для налагодження.
mu 無

3
bє байтами, sце епоха часу секунди
Авраам Сангха

1
@Dan Можливо, ви спочатку переглядаєте активні відповіді, які сортують повідомлення відповідей залежно від того, коли вони востаннє мали активність. Якщо так, ви можете змінити це, вибравши один із активних / найстаріших / голосів трохи нижче тексту запитання. Крім цього, ця відповідь знаходиться вгорі в режимі анонімного перегляду.
mu 無

2
Існує також , lru_crawler metadump allщо буде скидати все ключі кеша, а не "просто" перший 1M .. github.com/memcached/memcached/blob / ...
Kaos

65

memdump

Для цієї (частини) команди є memcdump(іноді ), наприклад:memdumplibmemcached-tools

memcdump --servers=localhost

який поверне всі ключі.


memcached-tool

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

memcached-tool localhost:11211 dump | less

який скидає всі ключі та значення.

Дивитися також:


4
обережно з 'memdump' ця команда - це чудовий спосіб зламати ваш термінал.
deweydb

5
Обережно! dumpСуб-команда для memcached-toolсхоже , щоб очистити кеш :( --might безпечніше використовувати displayабо statsперший.
MarkHu

4
У Ubuntu Xenial називається пакет, що містить memdump libmemcached-tools, а двійковий код інструменту називається memcdump.
тодішвидко,

5
Для тих, хто шукає, memcached-toolце дещо приховано в каталозі, який може бути не в стандарті PATH- принаймні, на Ubuntu Xenial - тут:/usr/share/memcached/scripts/
sxc731

17

Базуйтесь на @mu 無 відповіді тут. Я написав сценарій скидання кешу.

Сценарій скидає весь вміст запам’ятованого сервера. Це тестується з Ubuntu 12.04 і локальним хостом, так що ваш пробіг може відрізнятися.

#!/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я повинен був явно надіслати команду виходу до запам’ятовування. Я змінив вашу команду на це і зараз працює належним чином: 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, ви можете запустити

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

1
Це потрібно зробити після addServer: $c->setOption(Memcached::OPT_BINARY_PROTOCOL, false); Для новіших версій Memcached
hack4mer

Все ж відповідь - bool (помилково) :-(
Вольфганг Блессен

2
@WolfgangBlessen - це пов’язано з помилкою в запам’ятовуванні - вона виправлена ​​в новітніх версіях. github.com/php-memcached-dev/php-memcached/isissue/203
billynoah

@billynoah Thx, я дійсно бачу результати вже зараз, і запам’ятовування починає корисно :-)
Wolfgang Blessen

12

Баш

Щоб отримати список ключів у Bash, виконайте наступні дії.

Спочатку визначте наступну функцію обгортки, щоб спростити її використання (скопіюйте та вставте в оболонку):

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

Запам'ятовується 1.4.31 і вище

Ви можете використовувати lru_crawler metadump allкоманду для скидання (більшості) метаданих для (усіх) елементів кешу.

На відміну від cachedump, це не спричиняє серйозних проблем із роботою та не обмежує кількість ключів, які можна скинути.

Приклад команди за допомогою раніше визначеної функції:

memcmd lru_crawler metadump all

Дивіться: Примітки до випуску1431 .


Запам'ятовується 1.4.30 і нижче

Отримайте список плит, використовуючи команду статистики елементів , наприклад:

memcmd stats items

Для кожного класу slub ви можете отримати список елементів, вказавши ідентифікатор slab разом із обмеженим номером ( 0- необмежено):

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

Примітка. Це потрібно зробити для кожного згаданих серверів.

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

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 .


Пов'язані:


5

Найпростіший спосіб - використання пакету python-memcached-stats, https://github.com/abstatic/python-memcached-stats

Метод ключів () повинен змусити вас йти.

Приклад -

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.