我有一些实体,我需要通过丢弃旧实体来保持它们的数量有限。就像日志条目维护一样。 GAE有什么好方法可以做到这一点吗?
我心中的选择:
选项1.为每个实体添加Date属性。创建cron作业以每天检查数据存储区统计信息。如果超出限制,请查询该类实体,并按日期排序最早的第一个。删除它们直到大小小于,例如0.9 * max_limit。
选项2.选项1需要带索引的附加属性。我观察到实体键ID 可能可能会增加。所以我想只查询键并按升序排序。删除ID较小的那些。它不需要额外的属性(日期)和索引。但我真的很担心关键身份是否会得到保证越来越多?
我认为这是一项常见的数据维护任务。有没有成熟的方法呢?
顺便说一句,我的应用程序的一个小广告,免费和纯粹为编码器的乐趣! http://robotypo.appspot.com
答案 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。
希望这有帮助!