基本缓存无法在Google App Engine应用程序中运行

时间:2016-06-16 09:33:16

标签: python python-2.7 google-app-engine caching google-cloud-datastore

我正在使用Google App Engine创建一个博客,现在只允许我发布条目并查看它们。我正在跟随Steve Huffman在Udacity上的Web开发课程,他展示了一种简单的缓存技术来减少数据库查询。这是我的代码(他指示的代码):

CACHE = {}
def top_entries():
    key = 'top'
    # logging.error(CACHE)
    if key in CACHE:
        entries = CACHE[key]
    else:
        logging.error("DB QUERY")
        entries = db.GqlQuery('select * from Entries order by created desc limit 10')
        entries = list(entries)
        CACHE[key] = entries
    return entries

class MainPage(webapp2.RequestHandler):
    def get(self):
        entries = top_entries()
        self.response.write(render_str('mainpage.html', entries=entries))

mainpage.html只是列出最近10个条目的主页面。

基本上,CACHE是一个字典,用于存储标识特定数据库查询的密钥(在这种情况下,列出前10个条目),并且在进一步调用同一查询时,应用程序只需查看没有进行数据库调用的字典。

应该发生什么:

  1. 我第一次加载页面,并且我的控制台上打印了DB QUERY,因为它是数据库调用。查询结果存储在CACHE

  2. 我重新加载并且由于缓存有密钥而未打印DB QUERY

  3. 上述事情发生了,但前提是我有一个全新的标签可供使用。如果我已经有一个选项卡,我正在处理这个应用程序,我关闭服务器,重新启动它,然后尝试再次重新加载页面,上面的功能不起作用。会发生什么是第1步发生两次,然后是第2步。看起来第一次重新加载页面时,密钥没有存储在CACHE中,而是第二次。

    如果以上段落难以遵循,这是控制台日志:

    我第一次启动服务器并开始处理新选项卡:

    PS C:\Users\IBM_ADMIN> python `C:\Program Files (x86)\Google\google_appengine\dev_appserver.py' 'C:\Users\IBM_ADMIN\Downloads\Udacity\Web Development\Blog Project'
    INFO     2016-06-16 14:31:04,000 sdk_update_checker.py:229] Checking for updates to the SDK.
    INFO     2016-06-16 14:31:06,525 api_server.py:205] Starting API server at: http://localhost:53305
    INFO     2016-06-16 14:31:06,545 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-06-16 14:31:06,552 admin_server.py:116] Starting admin server at: http://localhost:8000
    ERROR    2016-06-16 09:01:15,358 blog.py:134] DB QUERY
    INFO     2016-06-16 14:31:15,529 module.py:787] default: "GET / HTTP/1.1" 200 1849
    INFO     2016-06-16 14:31:17,984 module.py:787] default: "GET / HTTP/1.1" 200 1849
    INFO     2016-06-16 14:31:45,944 shutdown.py:45] Shutting down.
    INFO     2016-06-16 14:31:46,040 api_server.py:648] Applying all pending transactions and saving the datastore
    INFO     2016-06-16 14:31:46,042 api_server.py:651] Saving search indexes
    

    当我没有打开新标签但开始使用旧标签时会发生这种情况。

    PS C:\Users\IBM_ADMIN> python `C:\Program Files (x86)\Google\google_appengine\dev_appserver.py' 'C:\Users\IBM_ADMIN\Downloads\Udacity\Web Development\Blog Project'
    INFO     2016-06-16 14:31:56,470 sdk_update_checker.py:229] Checking for updates to the SDK.
    INFO     2016-06-16 14:31:58,637 api_server.py:205] Starting API server at: http://localhost:53318
    INFO     2016-06-16 14:31:58,651 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
    INFO     2016-06-16 14:31:58,657 admin_server.py:116] Starting admin server at: http://localhost:8000
    ERROR    2016-06-16 09:02:08,336 blog.py:134] DB QUERY
    INFO     2016-06-16 14:32:08,526 module.py:787] default: "GET / HTTP/1.1" 200 1849
    ERROR    2016-06-16 09:02:12,538 blog.py:134] DB QUERY
    INFO     2016-06-16 14:32:12,684 module.py:787] default: "GET / HTTP/1.1" 200 1849
    INFO     2016-06-16 14:32:16,822 module.py:787] default: "GET / HTTP/1.1" 200 1849
    INFO     2016-06-16 14:32:21,428 shutdown.py:45] Shutting down.
    INFO     2016-06-16 14:32:21,430 api_server.py:648] Applying all pending transactions and saving the datastore
    INFO     2016-06-16 14:32:21,430 api_server.py:651] Saving search indexes
    

    DB QUERY打印两次而不是一次。我想不出有什么理由会这样做。 (也许是因为我的浏览器cookie?)

1 个答案:

答案 0 :(得分:3)

您正在实例级别进行缓存,您可以将实例数量或实例回收(关闭),并在请求中实例化新实例。

如果要在实例之间共享缓存,请尝试使用Memcache: https://cloud.google.com/appengine/docs/python/memcache/

您可以结合使用两种方法(实例缓存+内存缓存)