Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌应用引擎-缓存生成的HTML_Html_Google App Engine_Caching - Fatal编程技术网

谷歌应用引擎-缓存生成的HTML

谷歌应用引擎-缓存生成的HTML,html,google-app-engine,caching,Html,Google App Engine,Caching,我已经编写了一个Google应用程序引擎应用程序,它通过编程生成了一堆HTML代码,对于登录到我的系统的每个用户来说,这些代码的输出都是相同的,我知道,当代码投入生产时,这将是有效的。因此,我试图找出缓存生成页面的最佳方法 最可能的选择是生成页面并将其写入数据库,然后对照代码上次更新的时间检查给定页面的数据库put操作时间。然后,如果代码比上一次放入数据库的代码(对于特定的HTML请求)要新,则会生成和提供新的HTML,并将其缓存到数据库中。如果代码比上一次放入数据库的代码旧,那么我将直接从数据

我已经编写了一个Google应用程序引擎应用程序,它通过编程生成了一堆HTML代码,对于登录到我的系统的每个用户来说,这些代码的输出都是相同的,我知道,当代码投入生产时,这将是有效的。因此,我试图找出缓存生成页面的最佳方法

最可能的选择是生成页面并将其写入数据库,然后对照代码上次更新的时间检查给定页面的数据库put操作时间。然后,如果代码比上一次放入数据库的代码(对于特定的HTML请求)要新,则会生成和提供新的HTML,并将其缓存到数据库中。如果代码比上一次放入数据库的代码旧,那么我将直接从数据库获取HTML并提供它(因此避免了生成HTML时的所有CPU浪费)。我不仅希望最小化加载时间,而且希望最小化CPU使用

然而,我遇到的一个问题是,我不知道如何通过编程检查上传到应用程序引擎的代码版本何时更新

对于这种方法,或者缓存生成的html的其他方法,我愿意接受任何建议

请注意,虽然memcache在这种情况下可能会有所帮助,但我相信它不是最终的解决方案,因为我实际上只需要在代码更新时重新生成html(而不是每次memcache过期时)。

按速度顺序:

  • 内存缓存
  • 数据存储中的缓存HTML
  • 整页生成
  • 您的缓存解决方案应该考虑到这一点。本质上,我可能会建议无论如何使用memcache。在大多数情况下,它将比访问数据存储更快。当您生成一大块HTML时,缓存的主要好处之一是,您可能不必因访问数据存储而受到I/O惩罚。如果使用数据存储缓存,仍然会受到I/O惩罚。除非您有一个非常复杂的页面,否则重新生成所有内容和从数据存储中缓存的html中提取内容之间的区别可能相当小。与每次调用数据存储相比,从memcache中获取大量非常快速的缓存命中并每隔一段时间执行一次完整的重新生成可能更好。当您进行更新时,没有任何东西可以阻止您使memcache中缓存的HTML无效,如果您的流量足够大,您可以随时使用多级缓存系统

    然而,我主要担心的是,这是过早的优化。如果您还没有流量,请将缓存保持在最低限度。AppEngine提供了一套非常方便的性能分析工具,在获得至少几个QP流量后,您应该使用这些工具来识别瓶颈


    在任何时候进行性能优化时,请先测量!许多性能“优化”要么比原来的慢,完全相同,要么具有负面的用户体验特征(如过时的数据)。在确定必须进行优化之前不要进行优化。

    不久前,我写过关于在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