在数据存储模型-应用程序引擎中只保留n个实体



我有一个ndb模型,看起来像这样:

class Post(ndb.Model):
   time   = ndb.DateTimeProperty()
   body   = ndb.TextProperty()

我只对存储N个帖子感兴趣。因此,如果我已经有N个Post实体,并且我添加了一个新实体,我想删除最旧的Post(基于DateTime),以便添加新的Post,并且实体的总数仍然是N;类似于圆形队列的东西。

做这件事最有效的方法是什么?我能想到两种方法:

1) 在插入时处理此问题,因此获取偏移量为N-1的实体(结果应该只有一个实体)并删除该实体,然后插入新实体(或按时间升序排列并获取第一个实体)。

2) 在cronjob中处理此问题,因此每24小时获取偏移量为N的实体并删除所有实体。

当然,也可以选择把它们留在那里。。我不会使用超过N个实体,但我猜删除实体可能会很昂贵,所以每次检索帖子时我都可以做一个fetch(N),并按时间递减排序。

这样做的全部目的是做一些便宜的事情,这样我就不会浪费资源。

编辑:我预测N可能在100-300 左右

您没有提到您预期的qps量,但"每24小时"的cron作业建议为低到中等。您也没有说明N=100还是N=10000。如果不是高容量事务性的,那么这可以通过定期调度的cron启动的拉队列非常容易地处理——大约每隔几分钟一次。您需要第二个实体来跟踪上次使用的id号。拉队列任务将简单地读取所使用的最后一个实体id号(假设N=100,这些id号的范围为100-199)。租用这些任务并完成它们,为您的新(替换)实体创建一个新ID列表。做起来很简单。一旦你完成了租用的任务,就做一个multiple put()。我不能确定multi-put()的有效限制是多少,但使用像你这样的小型实体一次做几百个没有问题。如果你说的是N=10000,那么我仍然会这样做,但你需要迭代使用区块的租赁任务。我还将添加一个索引属性,该属性设置为unix时间戳(以毫秒为单位),id号位于小数位置。这将为您提供一个非常简单的索引字段,以便按任意顺序连续遍历实体。如果您依赖于多个puts()和DateProperty,那么您可能会遇到日期冲突的问题。

总结:找出一种方法,为您的实体ID使用一种编码方案,以实现排序,并使用cron+拉队列。利用时间戳字段对查询进行排序。

HTH,甜菊糖

  • 选项1包括每个新帖子1个输入、1个查询和1个删除。

  • 选项2使用每个新帖子1次投放,每天一次查询+批量删除。

  • 选项3每个新的Post 使用1个看跌期权

在所有情况下,您都可以使用相同的查询获得最新的N个Post,为了提高性能,可以对其进行memcached(添加新Post时使缓存无效)。请记住,您的查询应该先按时间降序排列,然后得到前N个结果。

因此,假设每天有一个以上的新职位,选项2比选项1更有效率,成本应该更低。

选项3/不删除帖子更有效(就数据库操作而言),你可能有兴趣保留旧帖子的历史记录,但你会为存储空间付费——如果你每月不增加千兆字节,那么这是非常小的,可能是你的最佳选择。

最新更新