我们如何确保在任何时候只有一个 JVM 实例在修改内存缓存键实例,并且在写入过程中没有发生读取?我可以使用低级存储或 JSR 包装器。
List<Foo> foos = cache.get("foos");
foos.add(new Foo());
cache.put("foos", foos);
我们有什么办法可以防止并发写入等?
谢谢
我们如何确保在任何时候只有一个 JVM 实例在修改内存缓存键实例,并且在写入过程中没有发生读取?我可以使用低级存储或 JSR 包装器。
List<Foo> foos = cache.get("foos");
foos.add(new Foo());
cache.put("foos", foos);
我们有什么办法可以防止并发写入等?
谢谢
Fh。几乎是在正确的道路上,但并不完全。他说 MemCache 以原子方式工作是对的,但这并不能帮助您处理“同步”。由于我们有许多 JVM 运行的实例,我们不能按照我们在考虑多线程环境时通常理解的内容来谈论真正的同步。这是跨一个或多个实例“同步” MemCache 访问的解决方案:
使用该方法MemcacheService.getIdentifiable(Object key)
,您可以获得一个Identifiable
对象实例。您可以稍后将其放回 MemCache 使用MemcacheService.putIfUntouched(...)
检查MemCache API 的 API:getIdentifiable()。Identifiable
Object 是一个包装器,其中包含您通过它的 Key 获取的 Object 。
以下是它的工作原理:
putIfUntouched(...)
来存储对象的第一个实例将成功,putIfUntouched
将返回true
。putIfUntouched
返回false
.您是否担心通过读取一个键来破坏内存缓存,而并行操作正在写入同一个键?不用担心,在 memcache 服务器上,这两个操作都将自动运行。
Memcache 永远不会输出“损坏”结果,写入时也不会出现损坏问题。