仅从内存缓存中读取实体(由Objectify保存),而不是从磁盘中读取

时间:2018-02-05 14:26:14

标签: google-app-engine objectify

我想从Memcache中读取一个实体。我知道它被驱逐的可能性很高,但对于这种情况并不重要,即使在执行此代码之后它也存在于Memcache中。

此实体与Objectify一起保存。当我使用namespace = ObjectifyCache,key = URL-safe-key,key-type = Java-String搜索时,我可以在Appengine Console的Memcache中看到它。

当我尝试使用本机方法获取它时,它返回null。

MemcacheService cache = MemcacheServiceFactory.getMemcacheService(ObjectifyFactory.MEMCACHE_NAMESPACE);
cache.setErrorHandler(ErrorHandlers.getConsistentLogAndContinue(Level.INFO));

Object object = cache.get(KeyFactory.createKeyString("key", "name"));
if(object == null) {
    log(Level.WARNING, "null returned from memcache, " + KeyFactory.createKeyString("key", "name"));
    return;
}

MyPojo pojo = ofy().load().fromEntity((Entity) object);

我在这里提出referred几个问题,但它并没有帮助,尽管看起来很顺利。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:0)

我确实错过了显而易见的事情。正如@ answer中指出的@stickfigure,save()delete()通过Objectify正在清除缓存中的条目,而load()正在填充它。保存后我立即尝试get()

我可以使用MemcacheService.Contains()方法查看最近是否已保存,然后可以正常加载。

这可能无法始终给出预期的结果,因为条目可以随时从缓存中删除,但在我的情况下,它将节省数百万个数据存储中Entity的可能性小于1%的读取操作。即使我通过驱逐而错过它也不会产生太大的影响。