文章目录

  • 现象
  • 版本控制
  • 最新方案
现象

当我们使用 es 的 API 去进行文档更新时,它首先读取原文档出来,然后对原文档进行更新,更新完成后再重新索引整个文档。不论你执行多少次更新,最终保存在 es 中的是最后一次更新的文档。但是如果有两个线程同时去更新,就有可能出问题。

要解决问题,就是锁。

  • 悲观锁

很悲观,每一次去读取数据的时候,都认为别人可能会修改数据,所以屏蔽一切可能破坏数据完整性的操作。关系型数据库中,悲观锁使用较多,例如行锁、表锁等等。

  • 乐观锁

很乐观,每次读取数据时,都认为别人不会修改数据,因此也不锁定数据,只有在提交数据时,才会检查数据完整性。这种方式可以省去锁的开销,进而提高吞吐量。

在 es 中,实际上使用的就是乐观锁。

版本控制

es6.7之前

在 es6.7 之前,使用 version+version_type 来进行乐观并发控制。根据前面的介绍,文档每被修改一个,version 就会自增一次,es 通过 version 字段来确保所有的操作都有序进行。

version 分为内部版本控制和外部版本控制。

  • 内部版本
    es 自己维护的就是内部版本,当创建一个文档时,es 会给文档的版本赋值为 1。

每当用户修改一次文档,版本号就回自增 1。

如果使用内部版本,es 要求 version 参数的值必须和 es 文档中 version 的值相当,才能操作成功。

  • 外部版本
    也可以维护外部版本。

在添加文档时,就指定版本号:

PUT blog/_doc/1?version=200&version_type=external
{"title":"2222"
}

以后更新的时候,版本要大于已有的版本号。

vertion_type=external 或者 vertion_type=external_gt 表示以后更新的时候,版本要大于已有的版本号。
vertion_type=external_gte 表示以后更新的时候,版本要大于等于已有的版本号。

最新方案

(Es6.7 之后)
现在使用 if_seq_no 和 if_primary_term 两个参数来做并发控制。

seq_no 不属于某一个文档,它是属于整个索引的(version 则是属于某一个文档的,每个文档的 version 互不影响)。现在更新文档时,使用 seq_no 来做并发。由于 seq_no 是属于整个 index 的,所以任何文档的修改或者新增,seq_no 都会自增。

现在就可以通过 seq_no 和 primary_term 来做乐观并发控制。

PUT blog/_doc/2?if_seq_no=5&if_primary_term=1
{"title":"6666"
}

ElasticSearch 并发的处理方式:锁和版本控制_07相关推荐

  1. Elasticsearch 并发修改乐观锁

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 并发修改乐观锁 博客分类: 搜索引擎,爬虫 来自: http://blog.csdn.net//j ...

  2. Elasticsearch——并发冲突以及解决方案

    1. 详解并发冲突 在电商场景下,工作流程为: 读取商品信息,包括库存数量 用户下单购买 更新商品信息,将库存数减一 如果是多线程操作,就可能有多个线程并发的去执行上述的3步骤流程,假如此时有两个人都 ...

  3. 常用并发工具类(锁和线程间通信工具类)

    常用并发工具类总结 JUC 下的常用并发工具类(锁和线程间通信工具类),主要包括 ReentrantLock.ReentrantReadWriteLock.CountDownLatch.CyclicB ...

  4. 【Elasticsearch】 Elasticsearch并发冲突问题

    1.概述 作者:缓慢移动的蜗牛 链接:https://www.jianshu.com/p/7a3652bae8a4 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 转 ...

  5. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronize ...

  6. 高效并发:Synchornized的锁优化详解

    高效并发:Synchornized的锁优化详解 1. HotSpot虚拟机的对象头的内存布局 2. 偏向锁 举一反三:当锁进入偏向状态时,存储hash码的位置被覆盖了,那对象的hash码存储到哪儿的? ...

  7. 29 Redis 应对并发访问的无锁原子操作

    29 Redis 应对并发访问的无锁原子操作 前言 一.并发访问中需要对什么进行控制? 二.Redis 的两种原子操作方法: 总结 前言 在使用 Redis 时,不可避免地会遇到并发访问的问题,比如说 ...

  8. Java高并发编程:线程锁技术

    目录 1 什么是线程锁 2 synchronized 1. 对象锁 2. 修饰对象方法 3. 类锁 4. 对象锁和类锁 5. 卖火车票示例 6. 生产一个消费一个示例 3 Lock 3.1 重入锁 R ...

  9. 并发编程中的锁、条件变量和信号量

    在并发编程中,经常会涉及到锁.条件变量和信号量.本文从并发开始,探究为什么需要它们,它们的概念,实现原理以及应用. 并发简介 并发是指多个事情,在同一时间段内同时发生了.和并发经常一起被提到的是并行. ...

最新文章

  1. 原创 | 清华开源迁移学习算法库
  2. Exception in thread main java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
  3. dhcp只能分配与路由器相同网段么_dhcp工作原理
  4. 串口上升时间标准_JESD204B串行接口时钟需要及其实现
  5. 一款jquery实现的整屏切换特效
  6. CVPR 2018 SINT++:《SINT++: Robust Visual Tracking via Adversarial Hard Positive Generation》论文笔记
  7. Ajax响应处理数据的三种格式(主要使用gson包)
  8. Hive-Based Registry使用
  9. java io加速器,Java 日期操作
  10. 工程师如何“神还原”用户问题?闲鱼回放技术揭秘
  11. smarty 引用php类,smarty 的PHP引用
  12. python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
  13. NUMA - Non Uniform Memory Architecture 非统一内存架构
  14. 【Deep Learning 五】课程二(mproving Deep Neural Networks),第一周(Setting up your Machine Learning Applicat)答案
  15. 【java笔记】网络编程概述
  16. Quartus II 12.0 下载、安装和破解
  17. 制作WIN_XP无人值守光盘
  18. 相机标定:机器人手眼标定全解析
  19. mysql权限管理命令小结
  20. 脉冲触发器和边沿触发器的区别

热门文章

  1. Elasticsearch 的使用,看这一篇就够了!
  2. 站在前人的肩膀上,新一代数学家正在崛起
  3. maven 对于java的要求_如何在Maven中表达对Java EE功能的依赖以过渡到Java 9?
  4. 论文翻译——FingerSound:Recognizing unistroke thumb gestures using a ring
  5. socket网络编程udp
  6. Kafka JMX 监控 之 jmxtrans + influxdb + grafana
  7. 划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道
  8. 使用 Flink Hudi 构建流式数据湖
  9. 高科技护航“史上最严”高考
  10. 傅奎:十年安全路,一颗好奇心