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)

我想将上述实现为两个功能:

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 怎么办?memcache.get(id) 会起作用吗?

4

2 回答 2

2

如果您希望所有实体类型都可以使用相同的功能,一个简单的选择是从父模型继承所有模型,该模型实现以下类方法:

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 回答
2

为什么不使用 ndb.Model 而不是 db.Model?

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

NDB API 在无模式对象数据存储中提供持久存储。它支持自动缓存、复杂查询和原子事务。NDB 非常适合存储结构化数据记录。它提供了 App Engine Datastore API 的替代方案。NDB 有一些 Datastore API 缺乏的特性:

StructuredProperty 类,允许实体具有嵌套结构 集成自动缓存,通常通过上下文缓存和 Memcache 异步 API 提供快速(且廉价)读取,允许并发操作(如果您不需要,还可以使用“同步”API那)

于 2013-03-01T13:24:25.720 回答