1

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

我心中的选项:

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

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

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

顺便说一句,我的应用程序的一个小广告,免费且纯粹是为了程序员的乐趣!http://robotypo.appspot.com

4

2 回答 2

1

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

以这种方式分配的 ID 不会被 Datastore 的自动 ID 序列生成器使用,并且可以在实体键中使用而不会发生冲突。

默认排序顺序也不保证按 ID 号排序:

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

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


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

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


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

于 2012-11-08T08:46:00.357 回答
1

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

class A:
    List<Key> limitedEntities;

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

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

希望这可以帮助!

于 2012-11-08T16:31:34.383 回答