19

さて、私はここで非常に基本的な疑問があると思います:

私はGAE(Java)でアプリを開発していて、多くのエンティティを返すデータストアへのクエリを実行しているので、それをキャッシュする必要があります。memcacheを使用していて、うまく機能していましたが、エンティティのリストを静的変数に保持すると、リクエスト全体がmemcacheを使用する場合の2倍の速度で実行されます。これは、エンティティを常に逆シリアル化しているわけではないためだと思います。

memcacheの代わりに静的変数を使用することの欠点は何でしょうか?クラウドにアプリケーションのインスタンスがいくつかあるかどうか、つまり静的変数のインスタンスがいくつかあるかどうかわかりません。

キャッシュしようとしているエンティティのリストは、先週の最高の(スコアが高い)投稿です。私はそのリストを取り、5つのランダムな投稿を選択し、それらを2、3ページに表示します。

助けてくれてありがとう!

4

3 に答える 3

16

App Engine は、アクセスするユーザー数の増加に応じて、アプリケーションの新しいインスタンスを作成することでスケーリングします。drudru が言ったように、異なるユーザーは異なるインスタンスによって提供される可能性があります。一般に、memcache は、グローバルに一貫性を保ちたいものを保存するための最速の場所です。ただし、あなたの場合、改善の余地があるかもしれません。

投稿のリストがあり、5 つを無作為に選択してユーザーに表示することに言及しました。2 人の異なるユーザーが異なる 5 つのセットを表示しても問題はありませんか? とにかくランダムなものを選択している場合は、問題ないかもしれません。次に、投稿の完全なリストを memcache に保存し、memcache から 5 つのランダムな投稿を取得して静的変数に保存します。

第二に、memcaching の正確な内容と、それをどのように引き出しているか。完全な投稿を大量に memcache に保存し、それらをすべて取得してから 5 つ選択していますか? 投稿のリストをダウンロードして 5 つを選択し、必要な 5 つだけを取得することもできますか? 逆シリアル化が速度を低下させていると思われる場合は、これが役立つかもしれません。投稿を取得した後、投稿に対して何らかの処理を行っていますか? もしそうなら、その処理の結果はキャッシュできますか?

于 2009-07-07T23:21:42.857 に答える
6

Googleは仮想マシンを好きなときに自由に起動および停止できるため、次のリクエストが発生したときに静的変数(またはJVMメモリ内の他のもの)が存在することを信頼することはできません。見た目からすると、同じJVMで追加のスレッドではなく、追加のJVMを開始することを好むようです。これにより、この問題が悪化します。

ただし、データがなくなった場合に別の場所からデータをロードする方法があれば、静的変数をキャッシュレイヤーとして使用できるはずです。

また、そこでメモリ使用量を超えようとはしません。使用できるメモリ量には割り当てが必要です。

于 2009-07-08T08:28:07.613 に答える
3

ええ、あなたのインスタンスがインターネット上のさまざまなユーザーに対して同じであるという保証はありません。最悪の場合、これを常に静的に読み取ることになります。memcacheは、利用可能であるというより高い保証があります。memcacheを使用するだけで、将来的にアプリにスケールの問題が発生することはありません。

于 2009-07-07T22:15:53.520 に答える