¿Cómo puedo tener Google App Engine claro memcache cada vez que se implementa un sitio?


El título lo pregunta todo. El contenido del sitio que estoy construyendo no cambiará muy rápidamente, por lo que Memcache podría almacenar datos durante meses, excepto cuando ponga una actualización. ¿Hay alguna forma de hacer que se borre la caché cada vez que despliegue el sitio? Estoy usando el tiempo de ejecución de Python.

Actualización 1

Usando jldupont's answer pongo el siguiente código en mi script principal de manejo de solicitudes...

Actualización 2

He cambiado a la método mencionado por Koen Bok en los comentarios de la respuesta seleccionada y prefijado todas mis claves memcache con os.environ['CURRENT_VERSION_ID']/con el código útil en la 2a actualización de la respuesta . Esta solución parece ser mucho más elegante que la función que publiqué antes.

Author: Community, 2009-12-31

4 answers

¿Has probado la función flush_all()? Docs here . Necesitará un poco de lógica y estado para detectar una nueva implementación o tener un script especial para realizar el lavado.

Actualizado : mira la ruta absoluta de uno de tus scripts: esto cambia en cada implementación. Puedes usar http://shell.appspot.com / para experimentar:

  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/versions / 1', '/base / data / home / apps / shell / 1.335852500710379686/']

Mira la línea con /shell/1.335852500710379686/.

Por lo tanto, simplemente mantenga una instantánea (en memcache; -) de esta variable de estado de implementación y compare para efectuar un lavado acto.

Actualizado 2 : como sugiere @Koen Bok, la variable de entorno CURRENT_VERSION_ID también se puede usar (parte de la ruta absoluta a los archivos de script también).

 import os
 os.environ["CURRENT_VERSION_ID"]
 21
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-31 18:02:06

Al crear claves para sus valores en caché, incluya la versión del archivo que está haciendo la caché obtiene/establece en la clave. De esa manera, cuando exista una nueva versión del archivo, ya no hará referencia a las versiones antiguas en la caché, sino que se dejarán caducar por sí solas.

Usamos CVS y java, por lo que declaramos esta variable en cada archivo que hará el almacenamiento en caché:

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

Cuando revises ese archivo, obtendrás algo como esto:

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

Puede adaptarse para su sistema de control de idioma y versión si no CVS. Recuerde codificar caracteres especiales de sus claves. Hemos descubierto que los valores clave de codificación de URL funcionan bien para memcached.

 3
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-31 04:13:09

No he probado esto, pero tal vez si inserta en memcache una clave con la versión # en el inicio de la instancia.

Luego, cuando se inicia la siguiente instancia, es decir, después de una implementación, verificaría memcache y su versión local, si difieren, borraría todo y reinicializaría la clave.

El único defecto es lo que si la clave es desalojada, podría reemplazar memcache a datastore pero luego su creación de datastore llama para cada inicio de instancia.

= edit =

Añadir a la parte superior de su llamado archivos python de la aplicación.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"])
 2
Author: bdavenport,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-14 17:18:28

Simplemente podría crear una ruta de acceso solo para administradores que borraría la caché cuando se accede a ella.

 0
Author: donut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-31 01:57:34