GAE - 保存DataStore读取

时间:2012-01-31 18:11:52

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

如果我有2个“表”,

“Table Player”,(Fields - PlayerKey,PlayerName,PlayerUrlPhoto) “Table PlayerGames”,(Fields - PlayerGameKey,PlayerKey,GameDate)

如果我要列出所有游戏,我将在“PlayerGames”中创建一个查询,并显示“玩家”信息,我将需要“GetObjectbyID”来阅读PlayerName和PLayerUrlPhoto。

这样做的最佳方式是什么?

1 - 使用GetObjectByID是正确的方法(为每个“PlayerGame”记录花费1“数据存储区读取”更多) 2 - 在“PlayerGames”中存储我知道将来需要列出的字段吗? (作为playername和playerurlphoto,保存“DataStore read”以获取播放器信息) 3 - 其他方式...

  • 提醒玩家可以更改他的名字和照片,所以如果我将名字和照片存储在“PlayerGames”中,我也必须更新所有记录。 (并将花费大量的DataStore Writes)

有人可以给我一个关于此的提示吗?

THX

2 个答案:

答案 0 :(得分:0)

听起来你只需要在你的实体面前使用memcache。当您按键获取播放器实体时,首先使用您从数据存储区键计算的键检查内存缓存,如果有值,请使用它。否则,执行数据存储读取,然后将结果存储在内存缓存中以备将来使用。这将大大减少数据存储区读取的数量。

当玩家更新她的记录时,只需在更新数据存储记录后删除memcache值。这会强制下一次读取转到数据存储区,并更新缓存。

答案 1 :(得分:0)

我正在用“returnmemcache”替换“GetObjectByID”。

我做了一个像这样的简单函数:

public Object returnmemcache(Class class,Key key)
{
     Cache cache = null;
     Object returntemp = null;
     try {
        CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
        cache = cacheFactory.createCache(Collections.emptyMap());
        returntemp = cache.get(key);
        if (returntemp==null)
        {   
            PersistenceManager pm = PMF.get().getPersistenceManager();
            returntemp=pm.getObjectById(class,key);
                    pm.close();
            cache.put(key, returntemp);
        }
    } catch (CacheException e) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        returntemp=pm.getObjectById(class.getClass(),key);
            pm.close();
    }
    return returntemp;
}

有没有人有更好的代码?