Сбросить ключи memcache из консоли GAE SDK?

В «Memcache Viewer» есть ли способ вывести список существующих ключей? Только для отладки, конечно, не для использования в каких-то скриптах!

Я спрашиваю, потому что не похоже, что GAE SDK использует «настоящий» сервер кэша памяти, поэтому я предполагаю, что он эмулируется в Python (для простоты, так как это просто сервер разработки). Это означало бы, что есть dict где-то с ключами/значениями..


person dbr    schedule 09.03.2009    source источник


Ответы (5)


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

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

Если у вас слишком много вещей, использующих memcached, чтобы сделать это в рамках сеанса отладки, начните регистрировать доступ.

Но имейте в виду — memcached работает быстро, потому что вообще не допускает таких вещей. Сервер сообщества имеет ограниченную функциональность для получения подмножества ключей, доступных в данном классе slab, но, вероятно, это не то, что вам действительно нужно, и, надеюсь, Google не реализует это в своем классе. :)

person Dustin    schedule 09.03.2009

Нет. В memcached я тоже не нашел такого функционала.

Размышляя над этой проблемой, я нашел это ограничение понятным — для этого потребуется вести реестр ключей со всеми связанными с этим проблемами, такими как истечение срока действия ключа, его недействительность и, конечно же, блокировка. Такая система не будет такой быстрой, какой должна быть memcache.

person zgoda    schedule 09.03.2009
comment
Действительно ли клиент memcache на сервере разработки GAE подключается к серверу memcache? Быстро взглянув на код, кажется, что он эмулируется в Python..? - person dbr; 09.03.2009
comment
Насколько я понимаю, это действительно собственная реализация Google, которая может быть основана на memcache, но точно не на ней. Однако он использует API-интерфейс memcache, потому что он прост и хорошо выполняет свою работу. - person Koen Bok; 09.03.2009

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

GAE SDK имитирует memcached, поэтому он также не предлагает эту функциональность.

person Andrew Wilkinson    schedule 09.03.2009
comment
Это неправильно. memcached наверняка хранит все ваши ключи, флаги, срок действия, идентификаторы cas и некоторые другие вещи в памяти. Чего он не делает, так это не выполняет никаких опций, которые не могут быть выполнены за известное время (O(1) — например, перечисление всех ключей). - person Dustin; 09.03.2009
comment
Вы совершенно правы, ключи хэшируются, чтобы определить, какой сервер использовать, но исходный ключ передается на сервер, а не хеш, как я изначально. - person Andrew Wilkinson; 09.03.2009

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

person LarryH    schedule 18.03.2009

Вот возможная работа. Я не знаком с Google App Engine, но на обычном сервере memcache вы можете перечислить все ключи через telnet следующим образом:

telnet 127.0.0.1 11211
stats items
STAT items:7:number 5
STAT items:7:age 88779
STAT items:7:evicted 0
STAT items:7:evicted_time 0
STAT items:7:outofmemory 0
STAT items:7:tailrepairs 0
... etc
END
stats cachedump 7 100
ITEM __builtin__.str_is_browser_supported·user_agent_hash=5706b885fdad3f7049dfb39455dfa7ab10086d97 [269 b; 1298926467 s]
END

Спасибо сообщению в блоге Грэма Кинга за этот хороший небольшой рецепт.

person rootsmith    schedule 02.03.2011