首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >摩尔菲亚版本(乐观锁)

摩尔菲亚版本(乐观锁)
EN

Stack Overflow用户
提问于 2015-03-24 19:56:56
回答 1查看 742关注 0票数 1

由于我们的项目具有非常高的从MongoDB读取数据的频率,所以我们决定将一些数据加载到Redis,以减少写/读Mongo的请求。

我们为redis-key存储实体的id,为redis-value存储实体的序列化JSON字符串。存储在Redis中的数据如下:

代码语言:javascript
复制
key   :  "id_18035138" 
value :  "{
           "id":"...",
           ...,
           "version":1
          }

在存储这些数据之后,当我们需要更新数据时,我们首先将JSON字符串解析为实体,然后更新属性,然后在Redis中刷新数据。因此,Redis中的数据将是最新的数据。

当我们需要将Redis数据保存到MongoDB时,我们首先将JSON字符串解析为实体,然后使用Morphia来保存实体,但我们面临这样的异常:

代码语言:javascript
复制
java.util.ConcurrentModificationException: Entity of class com.lk.game.entities.User (id='...',version='1') was concurrently updated.

我知道这一定是乐观锁的问题。我们如何解决这个并发异常?

谢谢你的回答。

EN

回答 1

Stack Overflow用户

发布于 2015-03-24 22:34:38

我们如何解决这个并发异常?

不同时写..。显然,至少有两个参与者并行地回写同一份文档。

我不认为它是可能知道如何或为什么会发生在您的系统与您所提供的信息。

也许你也可以改变架构?

  • 您能用MongoDB自己来处理负载吗?更多的硬件,更好的切分,更多的调优,.-这不能解决一般的并发问题,但您可能会缩短碰撞窗口。
  • 你能单独使用Redis吗?至少对于某些操作来说,从Redis读取数据似乎就足够了。
  • 你需要乐观的版本控制,还是“最后写赢”也能工作?
  • 也许MongoDB只是这个任务的错误数据库,您可以用CouchBase代替MongoDB+Redis (内置memcached并对一致的环哈希进行“更好的”切分)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29241721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档