Подтвердить что ты не робот

Как я могу очистить memcache Google App Engine при каждом развертывании сайта?

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

Обновление 1

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

Обновление 2

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

4b9b3361

Ответ 1

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

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

  import sys
  sys.path

[ '/основание/python_dist/Library/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', '/База/python_lib/версия/1', '/base/data/home/apps/shell/1.335852500710379686/']

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

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

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

 import os
 os.environ["CURRENT_VERSION_ID"]

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

Добавить в начало ваших названных файлов 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"])

Ответ 4

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