基本缓存在 Google App Engine 应用程序中不起作用

Rudimentary caching not working in a Google App Engine application

我正在使用 Google App Engine 创建博客,目前我只允许 post 个条目并查看它们的列表。我正在学习 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 没有打印,因为缓存中有密钥。

上述情况确实会发生,但前提是我有一个新的新标签页可以处理。如果我已经有一个正在使用此应用程序的选项卡,并且我关闭了服务器,重新启动它,然后再次尝试重新加载页面,则上述操作无效。发生的事情是第 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 被打印了两次而不是一次。我想不出它为什么会这样。 (可能是因为我的浏览器 cookies?)

您在实例级别进行缓存,您可以拥有多个实例,或者可以回收一个实例(关闭)并根据请求实例化一个新实例。

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

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