Google App Engine的模块和Handler Script缓存

标签:Google App Engine, Python

正如GAE文档中所述,GAE会缓存一些模块和Handler Script,避免每个request都重新载入。

这里有篇《Google App Engine 对 module 的缓存时间》,你可以看到模块是怎么被缓存的。

要让Handler Script被缓存,需要为这个Handler Script定义一个无参的main函数,并且请求必须要调用这个main函数。(一般来说,我们的应用程序都是先在main函数里进行的,所以这点基本符合。)
这里我照抄个缓存Handler Script的例子:
counter = 0

def main():
  global counter
  counter += 1
  print "Content-Type: text/plain"
  print ""
  print "My number: " + str(counter)

if __name__ == "__main__":
  main()
这样每访问一次,counter就会+1。

注意缓存会不定期清空,而且在你执行appcfg.py update来更新时,也会清空。所以不应将其用于需要永久存放的数据。

要注意的是,不要把和某一用户相关的数据放在这种缓存里,不然会被多个用户共享。

缓存的一些好处:
  1. 正则表达式会被解析和编译后,放在缓存中。这样再次访问时,就无需重新解析了。
  2. GqlQuery对象也可以缓存。由于构建GqlQuery对象是个很费时的操作,如果用bind方法重复利用被缓存的GqlQuery对象,就可以提高效率。
  3. 存放配置数据。如果配置数据是从文件中读取的,会造成每次运行都要读取文件。而如果缓存了,则无需再次读取。

一个不错的办法是,把APP缓存、Memcache和数据库做成三层存储系统。
当APP缓存清空时(判断是否为缺省值,或一个很小的值;建议将初始值设成一个不可能的值,比如次数为-100),就从Memcache中取,如果Memcache中也取不到,就从数据库取。这样不但节省时间,还少了很多次的API调用。
你可以在《在GAE中使用记录系统》这篇帖中看到实现的代码片段。

0条评论 你不来一发么↓

    想说点什么呢?