谷歌应用引擎-缓存生成的HTML
我已经编写了一个Google应用程序引擎应用程序,它通过编程生成了一堆HTML代码,对于登录到我的系统的每个用户来说,这些代码的输出都是相同的,我知道,当代码投入生产时,这将是有效的。因此,我试图找出缓存生成页面的最佳方法 最可能的选择是生成页面并将其写入数据库,然后对照代码上次更新的时间检查给定页面的数据库put操作时间。然后,如果代码比上一次放入数据库的代码(对于特定的HTML请求)要新,则会生成和提供新的HTML,并将其缓存到数据库中。如果代码比上一次放入数据库的代码旧,那么我将直接从数据库获取HTML并提供它(因此避免了生成HTML时的所有CPU浪费)。我不仅希望最小化加载时间,而且希望最小化CPU使用 然而,我遇到的一个问题是,我不知道如何通过编程检查上传到应用程序引擎的代码版本何时更新 对于这种方法,或者缓存生成的html的其他方法,我愿意接受任何建议 请注意,虽然memcache在这种情况下可能会有所帮助,但我相信它不是最终的解决方案,因为我实际上只需要在代码更新时重新生成html(而不是每次memcache过期时)。按速度顺序:谷歌应用引擎-缓存生成的HTML,html,google-app-engine,caching,Html,Google App Engine,Caching,我已经编写了一个Google应用程序引擎应用程序,它通过编程生成了一堆HTML代码,对于登录到我的系统的每个用户来说,这些代码的输出都是相同的,我知道,当代码投入生产时,这将是有效的。因此,我试图找出缓存生成页面的最佳方法 最可能的选择是生成页面并将其写入数据库,然后对照代码上次更新的时间检查给定页面的数据库put操作时间。然后,如果代码比上一次放入数据库的代码(对于特定的HTML请求)要新,则会生成和提供新的HTML,并将其缓存到数据库中。如果代码比上一次放入数据库的代码旧,那么我将直接从数据
在任何时候进行性能优化时,请先测量!许多性能“优化”要么比原来的慢,完全相同,要么具有负面的用户体验特征(如过时的数据)。在确定必须进行优化之前不要进行优化。不久前,我写过关于在AppEngine上编写博客系统的文章。您可能会对上的文章特别感兴趣。这不是一个完整的解决方案,但可能会提供一些有趣的缓存选项
允许您在不使用memcache的情况下进行缓存。只需提供站点的静态版本即可 这其实比你想象的容易多了 如果您已经有一个包含站点所有URL的文件(exURL.py),那么一半的工作已经完成 结构如下:
+-/website
+--/static
+---/html
+--/app/urls.py
+--/app/routes.py
+-/deploy.py
/html是提供静态文件的地方。url.py包含站点所有URL的列表。routes.py(如果您将routes移出main.py)将需要修改,以便您可以在本地看到动态生成的版本,但在生产中使用静态版本。py是一站式静态站点生成器
如何布局您的URL模块取决于。我个人使用它作为一个一站式服务来获取一个页面的所有元数据,但不包括YMMV
例如:
main = [
{ 'uri':'about-us', 'url':'/', 'template':'about-us.html', 'title':'About Us' }
]
由于站点的所有URL都是结构化的,所以抓取您自己的站点非常容易
路由配置稍微复杂一些。我不会详细讨论,因为有太多不同的方法可以实现这一点。重要的部分是检测您是在开发服务器上运行还是在生产服务器上运行所需的代码
这是:
# Detect whether this the 'Development' server
DEV = os.environ['SERVER_SOFTWARE'].startswith('Dev')
我更喜欢将它放在main.py中,并在全局范围内公开它,因为我使用它来打开/关闭其他东西,比如日志记录,但是,再一次,YMMV
最后,您需要爬虫程序/编译器:
import os
import sys
import urllib2
from app.urls import main
port = '8080'
local_folder = os.getcwd() + os.sep + 'static' + os.sep + 'html' + os.sep
print 'Outputting to: ' + local_folder
print '\nCompiling:'
for page in main:
http = urllib2.urlopen('http://localhost:' + port + page['url'])
file_name = page['template']
path = local_folder + file_name
local_file = open(path, 'w')
local_file.write(http.read())
local_file.close()
print ' - ' + file_name + ' compiled successfully...'
这真的是最基本的东西。当我创建它的时候,它是多么的简单,这让我震惊。这实际上相当于在浏览器中逐页打开站点,另存为html,然后将该文件复制到/static/html文件夹中
最棒的是,/html文件夹的工作方式与其他静态文件夹类似,因此它将自动被缓存,并且缓存过期时间将与所有其他静态文件相同
注意:这将处理所有页面都从根文件夹级别提供服务的站点。如果您需要更深层的文件夹嵌套,则需要稍加修改以处理该问题。旧线程,但随着技术的进步,我将对此进行评论。。。 另一个可能适合也可能不适合您的想法是生成HTML并将其存储在Google云存储上。 然后通过云存储为您提供的CDN链接访问HTML。 无需检查memcache或等待数据存储在新请求时唤醒。
我开始为appengine应用程序存储我所有的JavaScript、CSS和其他静态内容(图像、下载等),这对我来说很好。但是。。。这就是memcache的用途!除非生成HTML