我只想从Memcache中读取实体。我知道它被驱逐的可能性很高,但对于这个场景来说,它并不是那么重要,即使在执行了这段代码之后,它仍然存在于Memcache中。
此实体与Objectify一起保存。我可以在Appengine控制台的Memcache中看到它,当使用namespace=ObjectifyCache搜索时,key=URL-safe-key,key-type=Java-String。
当我尝试使用本机方法获取它时,它返回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的问题,但它没有帮助,尽管它看起来很直接。我是不是漏掉了什么明显的东西?
发布于 2018-02-06 07:08:33
我确实遗漏了一些显而易见的东西。正如@stickfigure在此answer中指出的那样,save()
和delete()
通过Objectify清除缓存中的条目,而load()
再次填充它。我试图在保存后立即对其进行get()
。
我可以使用MemcacheService.Contains()
方法来查看它是否是最近保存的,然后可以正常加载。
这可能不会总是给出预期的结果,因为条目可以随时从缓存中删除,但在我的情况下,它将节省数百万次读取操作,其中Entity
出现在数据存储中的可能性小于1%。即使我因为被驱逐而错过了,也不会有太大的影响。
https://stackoverflow.com/questions/48624731
复制相似问题