2013-03-01 25 views
0

为了减少数据存储读写,人们建议使用内存缓存:谷歌应用程序引擎:通过型号名称作为参数传递给函数

写:

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)会工作吗?

回答

2

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

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

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

的StructuredProperty类,它允许实体具有嵌套结构 集成自动缓存,它通常具有经由在上下文高速缓存和内存缓存 异步的API快速(和廉价的)读它们允许并发动作(如果你不需要这些API,则使用“同步”API)

+1

是的,我确实使用了ndb。也许我对它并不熟悉。那么,你是说我正在尝试做的事情已经在ndb中完成了?那么,这是一个好消息。 – 2013-03-01 13:31:47

+1

是的。 ndb为get_by_id()自动缓存,但不会缓存查询。 – dragonx 2013-03-01 16:33:33

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)