Google App Engine - 将实体金额保持在限制内的推荐方法是什么?



我有一些实体,我需要通过丢弃旧的实体来保持有限的数量。就像日志条目维护一样。GAE有什么好方法?

我脑海中的选择:

选项1.为每个实体中的每个实体添加日期属性。创建CRON作业每天检查数据存储统计信息。如果超过限制,请查询这种类型的某些实体,然后按日期与最古老的日期进行排序。删除它们,直到大小小于0.9 * max_limit。

选项2。选项1需要带有索引的额外属性。我观察到实体密钥ID可能会增加。因此,我想仅查询键,然后按升序排序。删除具有较小ID的删除。它不需要其他属性(日期)和索引。但是我非常担心关键ID是否会越来越多?

我认为这是一项常见的数据维护任务。有什么成熟的方法吗?

顺便说一句,这是我的应用程序的微小广告,纯粹是为了编码员的乐趣!http://robotypo.appspot.com

您不能假设ID始终在增加。关于id gen的文档仅保证:

以这种方式分配的ID将不会由数据存储使用 自动ID序列发生器,可用于无需 冲突。

也不能保证按ID编号对默认排序顺序进行排序:

如果未指定排序订单,则结果将以订单返回 它们是从数据存储中检索的。

含糊不清,并不是说默认顺序是由ID。


一种解决方案可能是使用旋转计数器,以跟踪第一个元素。当您要添加新实体时:获取计数器,将其递增,按限制进行模块,然后添加带有ID作为计数器值的新元素。所有这些都必须在交易中完成,以确保不受其他请求的汇总。具有相同密钥的新元素将覆盖存在的新元素,如果有的话。

当您想全部获取它们时,您可以手动生成键(既然它们都是已知的),进行批量提取,按ID排序,然后在计数器的值中将它们分成两个部分并交换这些部分。


如果您希望ID是唯一的,则可以维护一个单独的计数器(使用交易来修改和读取它,以使其安全)并以ID为价值创建实体,然后在达到限制时删除ID。

您可以创建第二个实体(我们称其为a),该实体保留要限制的实体的键列表,如这样(伪代码):

class A:
    List<Key> limitedEntities;

添加一个新实体时,您将其键添加在A的列表中。如果列表的长度超过限制,则将列表的第一个元素和删除相应的实体。

删除。

请注意,当您添加或删除实体时,应在事务中修改实体a列表。由于这些实体属于不同的实体组,因此您应该考虑使用跨组交易。

希望这会有所帮助!

最新更新