0

データストアの読み取りと書き込みを減らすために、人々は memcache の使用を提案します:

書く:

entity.put()
memcache.set(entity.key.id(), entity)

読んだ:

# id known:
entity = memcache.get(id)
if entity is None:
    entity = Model.get_by_id(id)
    memcache.set(id, entity)

上記を2つの関数として実装したいと思います:

def memPut(entity):
    entity.put()
    memcache.set(entity.key.id(), entity)

def memGet(Model, id):
    entity = memcache.get(id)
    if entity is None:
        entity = Model.get_by_id(id)
        memcache.set(id, entity)

memGetは単なる仮説です。私の質問: 1) モデルの名前をパラメーターとして関数に渡すにはどうすればよいですか? 2) ID を指定せずにエンティティを作成すると、GAE は ID として整数を使用します。同じ ID を持つ 2 つのエンティティ (もちろん異なるモデルからのもの) がある場合はどうなりますか? memcache.get(id) は機能しますか?

4

2 に答える 2

2

db.Modelの代わりにndb.Modelを使用してみませんか?

https://developers.google.com/appengine/docs/python/ndb/

NDB APIは、スキーマレスオブジェクトデータストアに永続ストレージを提供します。自動キャッシュ、高度なクエリ、およびアトミックトランザクションをサポートします。NDBは、構造化データレコードの保存に最適です。App EngineDatastoreAPIの代替手段を提供します。NDBには、DatastoreAPIに欠けているいくつかの機能があります。

エンティティがネストされた構造を持つことを可能にするStructuredPropertyクラス統合された自動キャッシング。通常、コンテキスト内キャッシュを介した高速(かつ安価な)読み取りと、同時アクションを可能にするMemcache非同期API(および必要がない場合は「同期」API)それ)

于 2013-03-01T13:24:25.720 に答える
2

すべてのエンティティ タイプで同じ関数を使用できるようにする場合、単純なオプションの 1 つは、次のクラス メソッドを実装する親モデルからすべてのモデルをサブクラス化することです。

class ParentClass(db.Model):
    @classmethod
    def memPut(cls, entity):
        entity.put()
        memcache.set(entity.key().id(), entity)

    @classmethod
    def memGet(cls, id):
        entity = memcache.get(id)
        if entity is None:
             entity = cls.get_by_id(id)
             memcache.set(id, entity)
        return entity

次に、ハンドラーで次のようにします。

 MyModel.memPut(entity)
 entity = MyModel.memGet(id)
于 2013-03-01T13:21:47.483 に答える