0

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のエントリを列挙する)を識別するキーを格納する辞書であり、同じクエリをさらに呼び出すと、データベース呼び出し。

何が起こるべきことはこれです:

  1. 私が初めてページをロードし、それがデータベース呼び出しだからDB QUERYは私のコンソール上に印刷されています。クエリの結果はCACHEに格納されます。

  2. リロードし、キャッシュにキーがあるので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回印刷されます。私はこのような振る舞いをする理由は考えられません。

答えて

3

インスタンスレベルでキャッシュしていて、インスタンス数を持たせることも、インスタンスをリサイクルすることもできます(シャットダウン)。要求に応じて新しいインスタンスをインスタンス化します。

あなたはインスタンス間でキャッシュを共有したい場合はMemcacheのを使用してみてください: https://cloud.google.com/appengine/docs/python/memcache/

あなたは両方のアプローチ(例えばキャッシュ+ memcacheの)

+0

を組み合わせることができますが、ビデオはどのようなものを持っていなかった、それが働きました完全に。おそらく、GAEが機能を変更したためでしょうか? –

+2

いいえ、これはいつもそうでした。各インスタンスは独立しているため、定義したキャッシュはインスタンス固有のものです。 uitilisationサイトが低い場合、インスタンスがすぐにシャットダウンし、キャッシュがなくなる可能性があります。答えに応じてmemcacheを使用してください。これは2008年にリリースされて以来、伝統的なappengineがどのように機能してきたかです。 –

+0

私はこれを初めて知ったので、さて、許してください。しかし、インスタンスは正確に何ですか?ページをロード/リロードするたびにインスタンスが作成されますか? –

関連する問題