这是将实体添加到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;
}
答案 0 :(得分:1)
我想知道我可以通过哪些方式为此进行缓存?
缓存是一个复杂的主题,所以请不要把它当作绝对真理。对于这个简单的put / get对,你需要在put期间设置缓存并在get期间检查缓存(应用the memcache pattern)。
此方法称为write-through cache,这意味着在确认操作之前,缓存和持久存储都会更新。
整个实体应该被缓存还是只是字段?
通常,实体只包含其可序列化的字段,因此我通常会缓存整个事物。
是否应在数据存储区放置之前或之后进行缓存?
通常在之后,因为您不希望缓存返回未成功提交到数据存储区的内容。这样,如果对数据存储区或内存缓存区的调用失败,则get操作仍将返回数据存储区的正确状态。
是否存在默认缓存过期,或者应该明确定义?
不指定生存时间(TTL)或指定TTL为0意味着memcache不会丢弃密钥,除非它处于内存压力下(可能会发生很多)。设置TTL意味着memcache将数据保持最多几秒钟。没有什么能保证数据存在 - 您应该始终将memcache视为不可靠的商店。
P.S。:Objectify可以自动为您执行此简单缓存。这是一个很棒的库,我强烈推荐它使用原始数据存储区。