Как сделать так, чтобы Google App Engine очищал кеш памяти каждый раз при развертывании сайта?

Название задает все. Контент на сайте, который я создаю, вообще не будет меняться очень быстро, поэтому Memcache потенциально может хранить данные в течение нескольких месяцев, за исключением тех случаев, когда я размещаю обновления. Есть ли способ очищать кеш каждый раз при развертывании сайта? Я использую среду выполнения Python.

Обновление 1

Использование jldupont answer Я поместил следующий код в свой основной скрипт обработки запросов. ..

Обновление 2

Я переключился на метод, упомянутый Koen Bok в комментариях к выбранному ответу, и снабдил все свои ключи кэша памяти префиксом os.environ['CURRENT_VERSION_ID']/ с полезным кодом в answer, второе обновление. Это решение кажется намного более элегантным, чем функция, которую я опубликовал ранее.


person donut    schedule 31.12.2009    source источник


Ответы (4)


Вы пробовали flush_all() функцию? Документы здесь. Вам понадобится немного логики и состояния, чтобы обнаружить новое развертывание, или иметь специальный скрипт для выполнения сброса.

Обновлено: посмотрите на абсолютный путь к одному из ваших скриптов: он меняется при каждом развертывании. Вы можете использовать http://shell.appspot.com/ для экспериментов:

  import sys
  sys.path

['/base/python_dist/lib/python25.zip', '/base/python_lib/versions/third_party/django-0.96', '/base/python_dist/lib/python2.5/', '/ base / python_dist / lib /python2.5/plat-linux2 ',' /base/python_dist/lib/python2.5/lib-tk ',' /base/python_dist/lib/python2.5/lib-dynload ',' / base / python_lib / версии / 1 ',' /base/data/home/apps/shell/1.335852500710379686/ ']

Посмотрите на строку с /shell/1.335852500710379686/.

Итак, просто сохраните снимок (в кэше памяти ;-) этой переменной состояния развертывания и сравните, чтобы выполнить действие очистки.

Обновлено 2: как было предложено @Koen Bok, также можно использовать переменную среды CURRENT_VERSION_ID (также часть абсолютного пути к файлам сценария).

 import os
 os.environ["CURRENT_VERSION_ID"]
person jldupont    schedule 31.12.2009
comment
Да, я знаю об этой функции. Как мне обнаружить новое развертывание, это моя основная проблема? - person donut; 31.12.2009
comment
вы можете посмотреть абсолютный путь к одному из ваших скриптов: он будет меняться при каждом развертывании. - person jldupont; 31.12.2009
comment
Вы можете использовать remote_api_shell.py для запуска flush_all () после развертывания. Это вручную, но легко. - person Adam Crossland; 31.12.2009
comment
Большое спасибо за уточнение. Я разместил полученный код в своем исходном вопросе. Работает лучше оберега! - person donut; 31.12.2009
comment
Почему бы просто не взять CURRENT_VERSION_ID из переменных окружения? И префикс ключей кеша выполняется быстрее, чем добавление одного дополнительного поиска кэша памяти для каждого запроса с помощью вышеуказанного метода. - person Koen Bok; 31.12.2009

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

Мы используем CVS и java, поэтому мы объявляем эту переменную в каждом файле, который будет кэшировать:

private static final String CVS_REVISION = "$Revision $";

Когда вы проверите этот файл, вы получите что-то вроде этого:

private static final String CVS_REVISION = "$Revision: 1.15 $";

Вы можете адаптироваться к вашему языку и системе контроля версий, если не CVS. Не забудьте кодировать специальные символы из ваших ключей. Мы обнаружили, что значения ключей кодирования URL-адресов хорошо подходят для memcached.

person Matt    schedule 31.12.2009
comment
Я использую git и недостаточно знаком с ним, чтобы знать, возможно ли это. Похоже, что это может быть более комплексное решение. Но решение jdupont будет работать без помощи системы контроля версий и более точно отвечает на вопрос. - person donut; 31.12.2009
comment
Я делаю именно это, но беру версию из переменных окружения appengine. Работает отлично. - person Koen Bok; 31.12.2009
comment
Рад, что ты нашел хорошее решение. Эта идея подходит нам, но вам больше подходит другое решение. - person Matt; 01.01.2010

Я не тестировал это, но, возможно, если вы вставите в memcache ключ с версией # при запуске экземпляра.

Затем, когда запускается следующий экземпляр, то есть после развертывания, он проверяет кэш памяти и его локальную версию, если они отличаются, очищает все и повторно инициализирует ключ.

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

= редактировать =

Добавьте в начало ваших вызываемых файлов python из app.yaml

# Check if the version is updated
if memcache.get("static-version") == os.environ["CURRENT_VERSION_ID"]:
    pass
else:
    memcache.flush_all()
    memcache.set(key="static-version", value=os.environ["CURRENT_VERSION_ID"])
person mindlesstux    schedule 13.09.2011
comment
Пожалуйста, объясните больше о выселенном ключе, что это означает и как это повлияет на это решение. - person donut; 15.09.2011
comment
Согласно документам по адресу code.google.com/appengine/ docs / python / memcache / Значения могут быть исключены из кеша при добавлении нового значения в кеш, если в кеше мало памяти. Когда значения удаляются из-за нехватки памяти, в первую очередь удаляются наименее использованные значения. Я бы имел в виду, если бы запись статической версии была исключена, и если я правильно думаю, она не пройдет, а скорее приведет к сбросу flush_all и ключа. - person mindlesstux; 16.09.2011
comment
Спасибо за объяснение. Итак, не лучше ли было бы просто добавить к каждому ключу memcache префикс версии вместо того, чтобы сохранять версию в отдельном значении? - person donut; 16.09.2011
comment
Возможно, если вы хотите хранить старые версии данных в кэше памяти и иметь, подумайте, это вызванные, многожильные ключи, если вы префикс своего ключа с развернутой версией приложения. (при условии, что вы не удаляете динамическую часть версии приложения, которую gae назначает версии вашего приложения). - person mindlesstux; 20.09.2011
comment
Я просто подумал, что добавление версии ко всем ключам в качестве префикса позволит избежать проблемы с вытеснением значения версии приложения. Однако, поскольку AppEngine сначала удаляет наименее использованные значения и этот вызов кэша памяти будет в начале приложения, возможно, это не будет проблемой. Единственная ситуация - когда один запрос заполняет кэш памяти. - person donut; 20.09.2011

Вы можете просто создать путь только для администратора, который будет очищать кеш при доступе.

person donut    schedule 31.12.2009
comment
Что ж, теперь это хорошая идея! Но было бы лучше, если бы это можно было как-то автоматизировать, как намекает jdupont. - person donut; 31.12.2009
comment
Это можно автоматизировать, взломав appcfg.py, чтобы включить вызов URL-адреса очистки кеша. - person Adam Crossland; 31.12.2009
comment
Eek, разветвление SDK! Я бы предпочел вызвать appcfg.py из сценария для загрузки и заставить этот сценарий делать что-нибудь еще, чем изменять его. Тем более, что я все равно загружаю только из make-файла ... - person Steve Jessop; 31.12.2009