Elastic Seach写入更新的并发原因,处理,以及优化

Elastic Search写入更新的并发原因,方案,处理以及优化

一. 情景(列子)

一个报名系统:

  1. 读取报名信息
  2. 用户点击报名
  3. 更新报名

程序上面来讲,在多线程的情况下,每个线程都去执行上面的报名的三个步骤,总有一个线程是先到的,假设是线程A,此时线程A就会先将本来报名名额数量100设置成99,然后线程B紧接着到达,这时产生了并发,他还没等线程A先将数量设置成99自己已经先取出原来的名额100,这个时候减去1后还是99,将数量设置成99了,但是正常的逻辑是98才对。这个是并发产生的原因。

二.方案

2种方案:悲观所和乐观锁

  1. 悲观锁类似mysql数据库中的锁表,当A线程读取报名信息(名额)的时候,进行(整张报名表锁。或者对名额进行行锁)这样,其他线程遇到锁后都不会执行查新,更新,插入。等到,A线程完成减1更新操作后,表进行解锁。这样另外一个线程可以继续执行上面的过程。
  2. 乐观锁类似Es 使用数据的版本号来进行控制。当A线程进入报名流程时,报完后,他的数量减1,这个时候B线程ke能比他快减1且比他更快的更新了报名名额为99,此时。A在更新时发现他的版本号已经和库里面的版本号不一致了,呢么他再次取出库里面的数量99再减一,如果此时C线程又比他快,呢么他再次发现版本号回不一致,再次从库汇总取出数量99.减一再次进去。依次类推直到他比被人快,这样虽然会重复好多步骤但是不给数据枷锁,并发能力比较高,悲观锁相比乐观锁的话就并发能力低了

三.处理(举例)

  1. 构建一条数据
PUT /testindex/testtype/11
{
   
	"fields1":"并发处理"
}
  1. 假设2个线程都get到了这条数据
GET /testindex/testtype/11
//显示结果如下:
{
   
  "_index": "testindex&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值