Google App Engineを使用してブログを作成していますが、今はエントリーを投稿してリストアップすることができます。私はUdacityのSteve HuffmanによるWeb開発コースに従っていました。そこでは、データベースクエリーを減らすための簡単なキャッシング手法を示しました。Google App Engineアプリケーションで基本的なキャッシングが動作しない
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回続いてステップ2が起こるということです。最初にページをリロードするときにキーがCACHE
に保存されていないようですが、2回目です。私は、サーバーを起動する初めて
、新鮮なタブで作業を開始します:ここで
は、上記の段落は従うことが困難である場合は、コンソールログです
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
が1回ではなく2回印刷されます。私はこのような振る舞いをする理由は考えられません。
を組み合わせることができますが、ビデオはどのようなものを持っていなかった、それが働きました完全に。おそらく、GAEが機能を変更したためでしょうか? –
いいえ、これはいつもそうでした。各インスタンスは独立しているため、定義したキャッシュはインスタンス固有のものです。 uitilisationサイトが低い場合、インスタンスがすぐにシャットダウンし、キャッシュがなくなる可能性があります。答えに応じてmemcacheを使用してください。これは2008年にリリースされて以来、伝統的なappengineがどのように機能してきたかです。 –
私はこれを初めて知ったので、さて、許してください。しかし、インスタンスは正確に何ですか?ページをロード/リロードするたびにインスタンスが作成されますか? –