将GAE实体缓存到Memcache

时间:2015-01-06 15:23:56

标签: java google-app-engine caching google-cloud-datastore

这是实体添加到GAE数据存储区的代码:

public Key put(Object object) {
    Key result = null;
    Iterable<Entity> entities = marshall(object);
    List<Key> keys = _ds.put(entities);
    if(isCached(object)){ // check if class is annotated with @Cached
        // TODO: How should I cache the Entity before put or after put?
    }
    assert list(entities).size() == keys.size();
    result = Iterables.getLast(keys);
    return result;
}
  • 我想知道我可以通过哪些方式为此进行缓存?
  • 整个实体应该缓存还是只是字段?
  • 是否应在数据存储区放置之前或之后进行缓存?
  • 是否存在默认缓存过期,或者是否应明确定义?

以下是获取数据存储实体的代码:

public <T> T get(Class<T> clazz, String key) {
    T result = null;
    try {
        String kind = getKind(clazz);
        if(isCached(clazz)){ // check if class is annotated with @Cached
              // TODO: How should I get cache?
        }
        Entity e = _ds.get(KeyStructure.createKey(kind, key));
        result = createInstance(clazz);
        unmarshaller().unmarshall(result, e);
    } catch (EntityNotFoundException e1) {
        e1.printStackTrace();
    }
    return result;
}
  • BTW,一个侧面问题是抓住Datastore get()请求或者让使用此代码的应用程序处理异常很好,最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

  

我想知道我可以通过哪些方式为此进行缓存?

缓存是一个复杂的主题,所以请不要把它当作绝对真理。对于这个简单的put / get对,你需要在put期间设置缓存并在get期间检查缓存(应用the memcache pattern)。

此方法称为write-through cache,这意味着在确认操作之前,缓存和持久存储都会更新。

  

整个实体应该被缓存还是只是字段?

通常,实体只包含其可序列化的字段,因此我通常会缓存整个事物。

  

是否应在数据存储区放置之前或之后进行缓存?

通常在之后,因为您不希望缓存返回未成功提交到数据存储区的内容。这样,如果对数据存储区或内存缓存区的调用失败,则get操作仍将返回数据存储区的正确状态。

  

是否存在默认缓存过期,或者应该明确定义?

不指定生存时间(TTL)或指定TTL为0意味着memcache不会丢弃密钥,除非它处于内存压力下(可能会发生很多)。设置TTL意味着memcache将数据保持最多几秒钟。没有什么能保证数据存在 - 您应该始终将memcache视为不可靠的商店。

P.S。:Objectify可以自动为您执行此简单缓存。这是一个很棒的库,我强烈推荐它使用原始数据存储区。