每次部署站点时,如何使用Google App Engine清除内存缓存?

时间:2009-12-31 01:45:30

标签: python google-app-engine deployment caching memcached

标题要求一切。我正在建立的网站上的内容根本不会很快改变,所以Memcache可能存储数据数月,除非我提出更新。有没有办法在每次部署网站时清除缓存?我正在使用Python运行时。

更新1

使用jldupontanswer我在主请求处理脚本中添加了以下代码...

更新2

我已在所选答案的评论中切换到Koen Bok中提到的方法,并将os.environ['CURRENT_VERSION_ID']/的所有记忆密钥加上answer第二次更新中的有用代码。这个解决方案似乎比我之前发布的功能更优雅。

4 个答案:

答案 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)

您可以创建一个仅限管理员的路径,以便在访问缓存时刷新缓存。