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

时间:2012-11-08 03:04:39

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

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

我心中的选择:

选项1.为每个实体添加Date属性。创建cron作业以每天检查数据存储区统计信息。如果超出限制,请查询该类实体,并按日期排序最早的第一个。删除它们直到大小小于,例如0.9 * max_limit。

选项2.选项1需要带索引的附加属性。我观察到实体键ID 可能可能会增加。所以我想只查询键并按升序排序。删除ID较小的那些。它不需要额外的属性(日期)和索引。但我真的很担心关键身份是否会得到保证越来越多?

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

顺便说一句,我的应用程序的一个小广告,免费和纯粹为编码器的乐趣! http://robotypo.appspot.com

2 个答案:

答案 0 :(得分:1)

您无法假设ID总是在增加。 docs about ID gen仅保证:

  

数据存储区不会使用以这种方式分配的ID   自动ID序列生成器,可以在没有实体键的情况下使用   冲突。

default sort order也不能保证按ID号排序:

  

如果未指定排序顺序,则会按顺序返回结果   它们是从数据存储区中检索的。

这是模糊的,并没有说默认顺序是由ID。


一种解决方案可能是使用跟踪第一个元素的旋转计数器。当您想要添加新实体时:获取计数器,递增计数器,按限制修改计数器,并添加一个ID为计数器值的新元素。这必须在事务中完成,以保证计数器不会被另一个请求递增。具有相同键的新元素将覆盖那里的一个元素,如果有的话。

当你想要全部获取它们时,你可以手动生成密钥(因为它们都是已知的),进行批量提取,按ID排序,然后将它们分成计数器值的两部分并交换它们。


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

答案 1 :(得分:1)

您可以创建第二个实体(让我们称之为A),它保留您要限制的实体的键列表,如下所示(伪代码):

class A:
    List<Key> limitedEntities;

添加新实体时,将其键添加到A列表中。如果列表长度超出限制,则获取列表的第一个元素并删除相应的实体。

请注意,添加或删除实体时,应修改事务中的实体A列表。由于这些实体属于不同的实体组,因此您应该考虑使用Cross-Group Transactions

希望这有帮助!