2012-11-08 27 views
1

我有一種實體,我需要通過丟棄舊的來限制它們的數量。就像日誌條目維護一樣。 GAE有什麼好的方法來做到這一點?Google App Engine - 將實體金額保持在限制範圍內的建議方法是什麼?

我心目中的選項:

選項1.爲每個這些實體添加Date屬性。創建cron作業來每天檢查數據存儲區統計信息。如果超出限制,請查詢一些此類實體,並按照最早的第一個日期進行排序。刪除它們直到尺寸小於,例如,0.9 * max_limit。

選項2.選項1需要額外的索引屬性。我觀察到實體密鑰ID 可能可能會增加。所以我想只查詢鍵並按升序排序。刪除具有較小ID的人。它不需要額外的財產(日期)和索引。但是我非常擔心密鑰ID是否能夠越來越多地被使用?

我認爲這是一個常見的數據維護任務。有沒有成熟的方法可以做到這一點?

順便說一下,我的應用程序的一個小廣告,免費和純粹的編碼器的樂趣! http://robotypo.appspot.com

回答

1

您不能認爲ID始終在增加。該docs about ID gen只能保證:以這種方式分配

ID不可由數據存儲區的 自動ID序列生成器使用,並且可以在實體按鍵無衝突 使用。

default sort order也不能保證由ID號來排序:

如果沒有指定排序順序,其結果示於它們從數據存儲中檢索到的順序 返回。

這是模糊的,並沒有說默認的順序是通過ID。


一種解決方案可能是使用旋轉計數器來跟蹤第一個元素。當你想添加新的實體時:獲取計數器,增加它,修改它的限制,並添加一個ID作爲計數器值的新元素。這必須在交易中完成,以保證計數器不會被另一個請求增加。具有相同密鑰的新元素將覆蓋那裏的一個,如果有的話。

當您想要全部獲取它們時,您可以手動生成密鑰(因爲它們都是已知的),執行批量提取,按ID排序,然後將它們按計數器的值拆分爲兩部分, 。


如果你想要的ID是唯一的,你可以保持一個獨立的計數器(用交易來修改和讀取,所以你是安全的),並創建ID作爲它的價值實體,然後刪除ID時的限制已達到。

+0

感謝您的回答。很高興知道自動生成的ID和默認獲取不能得到保證。您提到的旋轉計數器方法對於維護大量實體非常有效。但是,對於實際情況還有另一方面的要求:該ID不應該被重用,因爲它們在其他地方被引用。無法找到它們很好,但是如果它不正確(更改爲另一個實體),會引起混淆。有沒有辦法這樣做,而不創建另一個ID來唯一標識它們? – Verilocos

1

您可以創建第二個實體(我們稱之爲A),讓你想限制,這樣的(僞代碼)的實體鍵的列表:

class A: 
    List<Key> limitedEntities; 

當您添加新實體,您將它的關鍵字添加到列表中。如果列表的長度超過了限制,則將列表的第一個元素移除並刪除相應的實體。

請注意,當您添加或刪除實體時,您應該修改事務中實體A的列表。因爲這些實體屬於不同的實體組,所以您應該考慮使用Cross-Group Transactions

希望這會有所幫助!

+0

感謝您的回答。當限制很小時,這種方法是有幫助和有效的。任何建議,如果限額很大,比如說100萬? – Verilocos

+0

如果您有<5000個實體(應用程序引擎列表限制),這是一個很好的解決方案。 – mjibson

相關問題