【问题标题】:Datastore: Is it possible to only save to memcache when using ndb API?数据存储:使用 ndb API 时是否可以只保存到内存缓存?
【发布时间】:2013-07-03 23:19:12
【问题描述】:

亲爱的

目前我正在使用 ndb API 来存储一些统计信息。不幸的是,这成为我成本的主要来源。我认为如果我只将它们保存到内存缓存中,它应该会便宜得多。数据是否因缓存过期而丢失无关紧要。

阅读手册后,我假设 _use_datastore 类变量可用于配置此行为:

class StaticModel(ndb.Model):
    _use_datastore = False

    userid = ndb.StringProperty()
    created_at = ndb.DateTimeProperty(auto_now_add=True)

我可以知道上述说法是否是正确的解决方案?

干杯!

【问题讨论】:

    标签: google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:

    我认为有三种方法可以实现你想要的。

    首先是根据您的问题在 NDB 模型类上设置 _use_datastore = False。

    第二种方法是在您放置/获取/删除静态模型时传递 use_datastore=False。一个例子是:

    model = StaticModel(userid="foo")
    key = model.put(use_datastore=False)
    n = key.get(use_datastore=False)
    

    第三个选项是在 NDB 上下文中设置一个数据存储策略,该策略为任何 StaticModel 键返回 false。比如:

    context.set_datastore_policy(lambda key: True if key.kind() == 'StaticModel' else False)
    

    【讨论】:

    • 感谢您的精彩回答!
    • @james 刚刚发现了一些问题,因为您没有使用数据存储区,当您 put() 模型时,它不会为模型生成 id。在我的测试中,所有的 put 都成功,但它们返回相同的密钥 Key(StaticModel,None),这实际上是一个有效的密钥,并将返回最后一个放置的模型,但您将无法检索任何其他模型。解决这个问题的简单方法是为模型指定一个 ID,StaticModel(userid="foo",id="staticmodel_01")
    • 嗨,@PGower,我碰巧手动生成了密钥,所以这不会发生在我身上。不过,很高兴知道这个重要的限制。感谢分享和 +1
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多