java - 将 GAE 实体缓存到 Memcache

标签 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;
}
  • 顺便说一句,一个附带问题是捕获 Datastore get() 请求好还是让使用此代码的应用处理异常好,最佳实践是什么?

最佳答案

I want to know in what ways I can do caching for this?

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

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

Should the whole Entity be cached or just fields?

通常,一个实体仅由其可序列化字段组成,因此我通常会缓存整个实体。

Should it be cached before or after the Datastore put?

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

Is there a default cache expiration, or it should be explicitly defined?

不指定生存时间 (TTL) 或将 TTL 指定为 0 意味着 memcache 不会删除 key ,除非它面临内存压力(这种情况可能会发生很多)。设置 TTL 意味着 memcache 将最多保留数据秒数。没有什么可以保证数据会在那里 - 您应该始终将 memcache 视为不可靠的存储。

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

关于java - 将 GAE 实体缓存到 Memcache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27801727/

相关文章:

python - 在 memcache.get() 之前测试字符串是否是有效键

node.js - 从 Google App Engine 连接到 MongoDB Atlas

Google App Engine 上的 Java 应用程序?

c - 跟踪结果是否已经使用哈希表计算

ios - ASIDownloadCache 清除除某些项目外的所有项目

java - 如何使用如下所示的线程获取输出?

Java 正则表达式验证\[]

java - 如何用 Spring + Hibernate + MySQL 实现搜索过滤器?

java - 30个连续数字的最大乘积

caching - 如何使用golang(beego)在redis中放置没有过期的缓存