python - google cloud memcache
¿Cómo puedo hacer que Google App Engine elimine la Memcache cada vez que se implementa un sitio? (4)
¿Has probado la función flush_all()
? Documentos aquí . Necesitará un poco de lógica y estado para detectar una nueva implementación o tener una secuencia de comandos especial para realizar el enjuague.
Actualizado : observe la ruta absoluta de uno de sus scripts: esto cambia en cada implementación. Puede 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/ '']
Mire la línea con /shell/1.335852500710379686/ .
Por lo tanto, solo guarde una instantánea (en Memcache ;-) de esta variable de estado de implementación y compárela para realizar una acción de descarga.
Actualización 2 : como lo sugiere @Koen Bok, la variable de entorno CURRENT_VERSION_ID se puede usar también (parte de la ruta absoluta a los archivos de script también).
import os
os.environ["CURRENT_VERSION_ID"]
El título lo pregunta todo. El contenido del sitio que estoy construyendo no cambiará muy rápido y, por lo tanto, Memcache podría almacenar datos durante meses, excepto cuando actualizo una actualización. ¿Hay alguna manera de dejar en claro el caché cada vez que despliegue el sitio? Estoy usando el tiempo de ejecución de Python.
Actualización 1
Usando la answer jldupont puse el siguiente código en mi script de manejo de solicitudes principal ...
Actualización 2
Cambié al método mencionado por Koen Bok en los comentarios de la respuesta seleccionada y prefijé todas mis claves de os.environ[''CURRENT_VERSION_ID'']/
con os.environ[''CURRENT_VERSION_ID'']/
con el útil código en la segunda actualización de la answer . Esta solución parece ser mucho más elegante que la función que publiqué antes.
Al crear claves para sus valores en caché, incluya la versión del archivo que está haciendo la caché gets / sets en la clave. De esta forma, cuando exista una nueva versión del archivo, ya no hará referencia a las versiones anteriores en la memoria caché, sino que se expirarán por sí solas.
Utilizamos 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 adaptar su idioma y el sistema de control de versiones si no es CVS. Recuerda codificar caracteres especiales con tus llaves. Hemos encontrado que los valores de clave de codificación de URL funcionan bien para memcached.
No he probado esto, pero quizás si insertas en Memcache una clave con la versión # en el inicio de la instancia.
Luego, cuando se inicie la siguiente instancia, es decir, después de una implementación, se verificará la memoria Memcache y su versión local, si son diferentes, se enjuagará todo y volverá a inicializar la clave.
El único error es que si se desaloja la clave, podría reemplazar Memcache en el almacén de datos, pero luego las llamadas al almacén de datos crean cada inicio de instancia.
= editar =
Agregue a la parte superior de sus archivos llamados python desde 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"])
Solo podría crear una ruta de solo administrador que vacíe la memoria caché cuando se acceda a ella.