我想从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几个问题,但它并没有帮助,尽管看起来很顺利。我错过了一些明显的东西吗?
答案 0 :(得分:0)
我确实错过了显而易见的事情。正如@ answer中指出的@stickfigure,save()
和delete()
通过Objectify正在清除缓存中的条目,而load()
正在填充它。保存后我立即尝试get()
。
我可以使用MemcacheService.Contains()
方法查看最近是否已保存,然后可以正常加载。
这可能无法始终给出预期的结果,因为条目可以随时从缓存中删除,但在我的情况下,它将节省数百万个数据存储中Entity
的可能性小于1%的读取操作。即使我通过驱逐而错过它也不会产生太大的影响。