我正在使用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个条目),并且在进一步调用同一查询时,应用程序只需查看没有进行数据库调用的字典。
应该发生什么:
我第一次加载页面,并且我的控制台上打印了DB QUERY
,因为它是数据库调用。查询结果存储在CACHE
。
我重新加载并且由于缓存有密钥而未打印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
打印两次而不是一次。我想不出有什么理由会这样做。 (也许是因为我的浏览器cookie?)
答案 0 :(得分:3)
您正在实例级别进行缓存,您可以将实例数量或实例回收(关闭),并在请求中实例化新实例。
如果要在实例之间共享缓存,请尝试使用Memcache: https://cloud.google.com/appengine/docs/python/memcache/
您可以结合使用两种方法(实例缓存+内存缓存)