标题要求一切。我正在建立的网站上的内容根本不会很快改变,所以Memcache可能存储数据数月,除非我提出更新。有没有办法在每次部署网站时清除缓存?我正在使用Python运行时。
使用jldupont的answer我在主请求处理脚本中添加了以下代码...
我已在所选答案的评论中切换到Koen Bok中提到的方法,并将os.environ['CURRENT_VERSION_ID']/
的所有记忆密钥加上answer第二次更新中的有用代码。这个解决方案似乎比我之前发布的功能更优雅。
答案 0 :(得分:21)
您是否尝试过flush_all()
功能? Docs here。你需要一点逻辑和state来检测新部署或使用特殊脚本来执行刷新。
已更新:查看您的某个脚本的绝对路径:这会在每次部署时发生变化。您可以使用http://shell.appspot.com/进行试验:
import sys
sys.path
[ '/碱/ 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', '/碱/ python_lib /版本/ 1', '/base/data/home/apps/shell/1.335852500710379686 /']
使用 /shell/1.335852500710379686 / 查看该行。
因此,只需保留此部署状态变量的快照(在memcache ;-)中进行比较,以便进行刷新操作。
更新2 :根据@Koen Bok的建议,环境变量 CURRENT_VERSION_ID 也可以使用(也是脚本文件的绝对路径的一部分)。
import os
os.environ["CURRENT_VERSION_ID"]
答案 1 :(得分:3)
为缓存值创建密钥时,请包含在密钥中执行缓存获取/设置的文件的版本。这样,当存在新版本的文件时,它将不再引用缓存中的旧版本 - 它们将自行过期。
我们使用CVS和java,因此我们在每个将执行缓存的文件中声明此变量:
private static final String CVS_REVISION = "$Revision $";
当您检查该文件时,您将得到以下内容:
private static final String CVS_REVISION = "$Revision: 1.15 $";
如果不是CVS,您可以适应您的语言和版本控制系统。请记住从密钥中编码特殊字符。我们发现URL编码键值适用于memcached。
答案 2 :(得分:2)
我还没有对此进行过测试,但是如果你在实例启动时插入带有版本号的密钥的memcache中。
然后当下一个实例启动时,也就是在部署之后,它将检查memcache及其本地版本,如果它们不同,则刷新所有内容并重新初始化密钥。
如果密钥被驱逐,只有缺陷就是这样,可以将memcache替换为数据存储区,然后你的数据存储区会调用每个实例启动。
=编辑=
从app.yaml
添加到被调用的python文件的顶部# 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"])
答案 3 :(得分:0)
您可以创建一个仅限管理员的路径,以便在访问缓存时刷新缓存。