Как я могу очистить memcache Google App Engine при каждом развертывании сайта?
Название спрашивает все. Содержимое на сайте, которое я создаю, не изменится очень быстро, и поэтому Memcache может хранить данные в течение нескольких месяцев, за исключением тех случаев, когда я устанавливаю обновление. Есть ли способ очистить кеш при каждом развертывании сайта? Я использую среду выполнения Python.
Обновление 1
Используя jldupont answer Я поместил следующий код в свой основной запрос обработки script...дел >
Обновление 2
Я переключился на метод, упомянутый Koen Bok в выбранных ответах ответа, и префикс всех моих ключей memcache с помощью os.environ['CURRENT_VERSION_ID']/
с полезным кодом в answer Второе обновление. Это решение кажется намного более элегантным, чем функция, которую я опубликовал ранее.
Ответы
Ответ 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
Вы можете просто создать путь, доступный только администратору, который будет очищать кеш при его доступе.