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

Read an entity(saved by Objectify) from memcache only, not from the disk

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

这个实体是用 Objectify 保存的。当使用 namespace=ObjectifyCache, key=URL-safe-key, key-type=Java-String.

搜索时,我可以在 Appengine 控制台的 Memcache 中看到它

当我尝试使用本机方法获取它时,它 returns 为空。

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);

我在这里有 几个问题,但它没有帮助,尽管它看起来很直截了当。我在这里遗漏了一些明显的东西吗?

我确实遗漏了明显的东西。正如@stickfigure 在此 中指出的那样,save()delete() 通过 Objectify 正在清除缓存中的条目,而 load() 正在再次填充它。我试图在保存后立即 get() 它。

我可以用MemcacheService.Contains()的方法看看是不是最近保存的,然后就可以正常加载了。

这可能不会总是给出预期的结果,因为可以随时从缓存中删除条目,但在我的例子中,它将节省数百万次读取操作,其中 Entity 出现在数据存储中的机会小于 1%。即使我因驱逐而错过它,也不会有太大影响。