我们如何在app引擎上同步读取和写入mem缓存?

时间:2013-05-10 23:02:14

标签: google-app-engine

我们怎样才能确保JVM中只有一个实例在任何时候都在修改mem cache key实例,而且在写入过程中还没有发生读取?我可以使用低级存储或JSR包装。

List<Foo> foos = cache.get("foos");
foos.add(new Foo());
cache.put("foos", foos);

我们有什么方法可以防止并发写入等?

由于

2 个答案:

答案 0 :(得分:1)

Fh的。几乎是在正确的方式,但不完全。他是对的,说MemCache是​​原子地工作的,但这并不能帮你节省“同步”。由于我们有许多JVM运行的实例,因此在考虑多线程环境时,我们无法谈论我们通常理解的实际同步。以下是跨一个或多个实例“同步”MemCache访问的解决方案:

使用方法MemcacheService.getIdentifiable(Object key),您将获得一个Identifiable对象实例。您可以稍后使用MemcacheService.putIfUntouched(...)

将其放回MemCache中

检查MemCache API : getIdentifiable()处的API。 Identifiable对象是一个包装器,包含通过它的Key获取的Object。

以下是它的工作原理:

  • 实例A提取可识别的X。
  • 实例B在“同一时间”提取可识别的X
  • 实例A&amp; B将更新X的包装对象(实际上是你的对象)。
  • 执行putIfUntouched(...)存储对象的第一个实例将成功,putIfUntouched将返回true
  • 尝试此操作的第二个实例将无法执行此操作,putIfUntouched将返回false

答案 1 :(得分:0)

您是否担心通过读取密钥来破坏内存缓存,而并行操作是否写入相同的密钥?不要担心,在memcache服务器上,两个操作都将以原子方式运行。

Memcache永远不会输出'腐败'结果,写作时也不会出现腐败问题。