0

Python を使用して Google App Engine アプリを作成しました。このアプリケーションは多くのユーザー名を扱います。

50K のユーザー名のデータベースがあります。各ユーザー名には一意のハッシュ値があります。これもデータストアに保存されます。

アプリ ユーザーが任意のユーザー名を送信したとき。アプリケーションは、最初にユーザー名が DB に存在するかどうかを確認します。

新しいユーザー名の場合、アプリケーションは新しい名前の新しいハッシュを計算し、名前とハッシュを DataStore に保存します。

ユーザー名がデータストアに既に存在する場合は、データ ストアから古いハッシュを取得します。

サンプルコード:

class Names(db.Model):
    name = db.StringProperty(required=True)
    hash = db.StringProperty(required=True)

username = "debasish"
user_db = db.GqlQuery("SELECT * FROM Names WHERE name=:1", username)
user = user_db.get()
if user == None:
    #doesn't exist in DB..so calculate new hash for that name and store it in DB
    e = Names(name=username,hash="badasdbashdbhasbdasbdbjasbdjbasjdbasbdbasjdbjasbd")
    e.put()
else:
    #retrieve the old hash.
    self.response.out.write('{"name":"'+user.name+'","hash":"'+user.hash+'"}')            

私が直面している問題は、GAE の無料のデータ ストア読み取り操作のクォータです。すぐに超えてしまい、アプリケーションが動作しなくなります。

また、memcache にデータベース全体を追加して、このように memcache を実装しようとしました。しかし、それは失敗でもあり、結果はもっと悪いものでした。

def get_fresh_all(self):
    all_names = db.GqlQuery("SELECT * FROM Names")
    memcache.add('full_db', all_names, 3600)
    return all_names

だから、みんな提案してください、私は何か間違ったことをしていますか?? データストアの読み取り操作をより効率的にするにはどうすればよいですか??

前もって感謝します。

4

3 に答える 3

0

@Faisal のメソッドはうまく機能するはずです。クエリに 2 レベルのキャッシュが追加されます。

別のオプションは、ユーザー名とハッシュをセッションに保存することです。セッションごとに 1 回だけデータベースをチェックしてから、セッション変数から値を取得します。

于 2013-08-19T21:33:59.743 に答える
0

すべてではなく、ユーザー名 = ハッシュのみをキャッシュする必要があります。さらに、メモリ内キャッシュを追加します(これはインスタンスのみのキャッシュごとに機能します。グローバルモジュールレベルで辞書を作成するだけで、さらに役立つはずです)。これは、固有のヒット数に応じて非常に急速に増加する可能性がありますが、特定の数値のみを保持するロジックを追加できます. 以下にサンプルを示します。

cache = {}

def get_user_hash(username):
    if username in cache:
         return cache[username]
    hash = memcache.get(username)
    if not hash:
        hash = # retrieve from db
        if not hash:
            # put to db & assign hash=new_hash

        cache[username] = hash
        memcache.set(username, hash)
    return hash
于 2013-08-19T20:50:57.660 に答える