每次部署一个站点时,如何让Google应用引擎清除memcache?

2024-05-14 19:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

标题要求一切。我正在构建的站点的内容不会很快改变,因此Memcache可能会存储数月的数据,除非我发布更新。有没有办法在每次部署站点时清除缓存?我正在使用Python运行时。

更新1

使用jldupontanswer我在主请求处理脚本中放入了以下代码…

更新2

我已切换到所选答案注释中Koen Bok提到的方法,并在所有memcache键前加上os.environ['CURRENT_VERSION_ID']/answer第二次更新中的有用代码。这个解决方案似乎比我之前发布的函数优雅得多。


Tags: 数据方法答案代码answer脚本标题内容
3条回答

你试过flush_all()函数吗?Docs here。您将需要一点逻辑状态来检测新的部署,或者需要一个特殊的脚本来执行刷新。

已更新:查看其中一个脚本的绝对路径:每次部署时都会更改此路径。您可以使用http://shell.appspot.com/进行实验:

  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/']

查看带有/shell/1.335852500710379686/的行。

所以,只需保留这个部署状态变量的快照(在memcache中;-)并进行比较,就可以执行刷新操作。

更新2:根据@Koen Bok的建议,还可以使用环境变量CURRENT_VERSION_ID(也是脚本文件绝对路径的一部分)。

 import os
 os.environ["CURRENT_VERSION_ID"]

我还没有测试过,但如果你在实例启动时在memcache中插入一个版本为#的密钥。

然后当下一个实例启动时,也就是在部署之后,它将检查memcache及其本地版本(如果它们不同),刷新所有并重新初始化密钥。

唯一的缺陷是,如果密钥被逐出,可能会将memcache替换为datastore,但随后会为每个实例启动调用datastore。

=编辑=

从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"])

为缓存值创建键时,请在键中包含执行缓存获取/设置的文件的版本。这样,当文件的新版本存在时,它将不再引用缓存中的旧版本-它们将自行过期。

我们使用CVS和java,因此我们在将要进行缓存的每个文件中声明此变量:

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

当您签出该文件时,您将得到如下信息:

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

如果不是CVS,您可以适应您的语言和版本控制系统。记住用你的钥匙来编码特殊的字符。我们发现URL编码键值对memcached很有效。

相关问题 更多 >

    热门问题