2010-01-04 103 views
0

我有一個遊戲系統的用戶模型。需要每小時增加100點。Google App Engine Cron作業問題 - 批量更新

# the key_name is the userid in this case 
class User(db.Model): 
    points = db.IntegerProperty(default=0) 

因此應該準備一個處理程序,跨所有實體執行GQL查詢? (那不是有500K有點慢 - 百萬用戶實體?)

如:

users = User.all() # if i'm not mistaken, only 1000 queries can be done. 
for user in users: 
    user.points += 100 
    db.put(user) 

我想使用佇列,並分片計數器,克服了1000 limiy,我可以把它關閉

但是再次說明,爲什麼我不把用戶上次登錄時的時間差,如果是N小時,我會獎勵用戶N * 100分?這應該減少我的應用程序的負載。

如: 類用戶(db.Model): lastlogin = db.DateTimeProperty() 點= db.IntegerProperty(默認值爲0)

你們覺得呢?

回答

5

但是接下來爲什麼我不把用戶上次登錄時的時間差,如果是N小時,我會獎勵用戶N * 100分?這應該減少我的應用程序的負載。

是的,這是一個更有效的方法。這樣,每次用戶登錄只更新一次點數,而不是每小時更新一次用戶記錄,這會非常昂貴。在這個

2

兩個想法:

  • 不要擔心500K - 1M用戶條目。我不認識你或你的比賽,但如果你獲得超過1K的比賽,我會感到非常驚訝。

  • 如果有一種算法分配一次而不是每小時分配一次,這將會更好。那肯定會那麼做。問題出現了:用戶在線時,這些點增量是否也增加了?如果是這樣,你需要檢查每一個動作。另一方面,如果你這樣做,那麼你不需要在登錄時進行檢查。

1

Paging through large datasets討論這樣搞技術 - 這是寫在表格上顯示每頁X項目的背景,但其概念是相同的。

您可以通過將實際更新放入延期任務來進一步拆分工作。

但是,正如您所建議的那樣,僅根據需要計算該值可能更有效。