Elasticsearch的并发控制策略

文章目录

  • 利用external对版本号进行外部控制
  • 利用if_seq_no和if_primary_term作为唯一标识来避免版本冲突

  • ES中的文档是不可变更的。如果你更新一个文档,会将就文档标记为删除,同时增加一个全新的文档。同时文是的version字段加1
  • 内部版本控制
    • If_seq_no + If_primary_term
  • 使用外部版本(使用其他数据库作为主要数据存储)
    • version + version_type=external

利用external对版本号进行外部控制

当使用external版本类型时,Elasticsearch在处理索引请求时会对比传入文档的版本号和已存储文档的版本号。如果传入的版本号大于已存储的,就表明这是一个新版本的文档,Elasticsearch则会执行索引操作并更新文档的版本号。然而,如果传入的版本号小于或等于已有版本号,这就意味着可能存在并发修改的问题,Elasticsearch会认为发生了版本冲突,索引操作将被拒绝。

下面进行实战演练。在没有开启external模式的情况下执行如下命令。

DELETE products
PUT productsPUT products/_doc/1
{"title":"iphone","count":100
}GET products/_doc/1PUT products/_doc/1?version=2
{"title":"iphone","count":100
}

在这里插入图片描述

这表明内部版本控制不能使用乐观锁,也就是说,不能直接使用version,而需要使用if_seq_no和if_primary_term

如果开启了external模式,则执行如下命令。

PUT products/_doc/1?version=2&version_type=external
{"title":"iphone","count":100
}

在这里插入图片描述
与不用external相比,使用external后可以基于version进行文档更新操作。external_gt和external_gte在Elasticsearch中被用于控制版本冲突。简单来说,利用这种方式,只有当给定的版本号大于(gt)或大于等于(gte)当前版本号时,才会执行更新或索引操作

利用if_seq_no和if_primary_term作为唯一标识来避免版本冲突

DELETE products
PUT productsPUT products/_doc/1
{"title":"iphone","count":100
}GET products/_doc/1PUT products/_doc/1?if_seq_no=1&if_primary_term=1
{"title":"iphone","count":100
}

在这里插入图片描述
在执行索引写入操作时,Elasticsearch会检查传入的if_seq_no和if_primary_term是否与最后一次修改文档的序列号(seq no)和主要项(primary term)匹配。这两个参数共同提供了一种强大的控制机制,确保只有当所提供的版本信息与文档的最新状态一致时,才会执行写入操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Entity Framework】聊聊EF中复杂查询运算符

【Entity Framework】聊聊EF中复杂查询运算符 文章目录 【Entity Framework】聊聊EF中复杂查询运算符一、概述二、联接三、GroupJoin四、SelectMany4.1/集合选择器不引用外部4.2/集合选择器引用 where 子句中的外部 五、GroupBy六、Left Join七、总结 一、概述 语言集成查询 (…

使用Xterm实现终端构建

————html篇———— // 需要使用Xterm Xterm的官网&#xff1a; Xterm.js 新建项目 增加基本文件 下载 框架 npm init -y Xterm依赖 npm install xterm/xterm 参考文档写的代码 贴入代码 <html><head><link rel"stylesheet" href"nod…

免费思维13招之十三:种群型思维

免费思维13招之十三&#xff1a;种群型思维 免费思维的最后一个思维——族群思维 人&#xff0c;都是群居性的动物&#xff0c;在人群中的一部分人群对于另一部分人群来说&#xff0c;具有强大的吸引力。那么&#xff0c;我们就从这一点出发&#xff0c;通过对其中一部分人群进…

知识付费系统开发成本高吗,大学生有哪些可以网络授课的平台?你知道吗?

在线教育绝对是以后教育行业发展的方向&#xff0c;越来越多发线下机构慢慢的向这方面去开始转型&#xff0c;做网上教育。那么大学生有哪些可以网络授课的平台?你知道吗? 软件类的网上授课平台 如钉钉&#xff0c;飞书等&#xff0c;这些软件都是由网上授课功能的&#xff0…

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

Idea + maven 搭建 SSH (struts2 +hibernate5 + spring5) 环境

org.apache.struts struts2-core 2.3.35 org.apache.struts struts2-spring-plugin 2.3.35 org.apache.struts struts2-json-plugin 2.3.8 1.4 配置Java EE 坐标依赖 这里可以引入 servlet api&#xff0c;jstl 标签库等一系列工具 javax.servlet javax.servlet-api …

6大部分,20 个机器学习算法全面汇总!!建议收藏!(上篇)

前两天有小伙伴说想要把常见算法的原理 公式汇集起来。 这样非常非常方便查看&#xff01;分为上下两篇&#xff0c;下篇地址&#xff1a; 本次文章分别从下面6个方面&#xff0c;涉及到20个算法知识点&#xff1a; 监督学习算法 无监督学习算法 半监督学习算法 强化学习…

YOLOV8环境部署(GPU版本)

一、安装&#xff43;&#xff55;&#xff44;&#xff41;和&#xff43;&#xff55;&#xff44;&#xff4e;&#xff4e; 1、安装cuda之前先打开英伟达控制面板查看自己的显卡信息 2、“帮助”—>“系统信息”—>“组件”&#xff0c;然后看第三行的信息“Nvidia …

进程信号 signal

文章目录 信号基础信号的产生OS中的时间 信号的保存sigset_tsigprocmasksigpending 信号的捕捉用户态和内核态sigactionvolatile SIGCHLD 信号基础 生活中的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也知道快递来临…

elememt-plus的表格的增删改查#Vue3无需json数据,无需后端接口

elememt-plus的表格的增删改查#Vue3无需json数据&#xff0c;无需后端接口 实现效果&#xff1a; <template><!-- 演示地址 --><div class"dem-add"><!-- Search start --><div class"dem-title"><p>演示地址</…

Python装饰器:深入理解与应用实例

Python装饰器&#xff1a;深入理解与应用实例 一、引言 在Python编程中&#xff0c;装饰器&#xff08;Decorators&#xff09;是一个强大且实用的特性&#xff0c;它允许程序员在不修改原有函数或类代码的情况下&#xff0c;为其添加额外的功能。装饰器本质上是一个可调用对…

基于springboot的知识管理系统源码数据库

基于springboot的知识管理系统源码数据库 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生作业交流形式的网站。本文介绍了知识管理系统的开发全过程。通过分析企业对于知识管理系统的需求&#xff0c;创建了…

【Git教程】(十八)拆分大项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 拆分大项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 拆分模块版本库3.2 将拆分出的模块作为外部版本库集成 4️⃣ 替代解决方案 通常软件项目都是由单体小型系统开始的&#xff0c;在开发过程中项目规模和团队人员不断扩大&#xff0c; 将项目模块化会显得…

C#实现各种Hash计算

C#实现各种Hash计算 文章目录 C#实现各种Hash计算涉及框架及库目前支持可计算的类型核心代码完整可运行代码 BCrypt总结 涉及框架及库 自己在NuGet管理器里面安装即可 BouncyCastle.Cryptography&#xff1a;是加密算法和协议的.NET实现。 目前支持可计算的类型 BLAKE2B_16…

如何在Idea离线情况下安装vue.js插件

亲践有效&#xff0c;步骤如下: 1. 互联网环境登陆vue.js官网(Vue.js - IntelliJ IDEs Plugin | Marketplace)。 2. 然后先确定你的IDEA的版本&#xff1a;在你IDEA的安装文件中找到product-info.json&#xff0c;里面的buildNumber记录着你IDEA的精确版本号&#xff0c;根据…

【Entity Framework】EF中SaveChanges如何使用

【Entity Framework】EF中SaveChanges如何使用 文章目录 【Entity Framework】EF中SaveChanges如何使用一、概述二、更改跟踪和SaveChanges三、SaveChanges优势四、使用SaveChanges添加数据五、使用SaveChanges更新数据六、使用SaveChanges删除数据七、单个SaveChanges中的多个…

roscore启动报错的解决方法【将环境变量配置于最后】

今天在启动rviz时发生一个很奇怪的报错&#xff1a; rviz: error while loading shared libraries: librviz.so: cannot open shared object file: No such file or directory 我感觉很纳闷&#xff01;再试着启动一下roscore&#xff0c;发现如下报错&#xff1a; [rosout-1…

[muduo网络库]——使用muduo库搭建Echo服务器(剖析muduo网络库核心部分、设计思想)

在此之前&#xff0c;我们对于muduo库的每一类几乎都进行了逐行的分析&#xff0c;但是一个网络库的每个模块之间总是有千丝万缕的关系&#xff0c;所以可能有的地方还是有分析的不到位&#xff0c;所以从这一篇开始&#xff0c;我们从muduo的简单使用----搭建一个Echo服务器&a…

Python爬虫从入门到精通:一篇涵盖所有细节的高质量教程

目录 第一部分&#xff1a;Python爬虫基础 1.1 爬虫原理 1.2 Python爬虫常用库 1.3 爬虫实战案例 1.4 注意事项 第二部分&#xff1a;爬虫进阶技巧 2.1 处理动态加载的内容 2.2 登录认证 2.3 分布式爬取 2.4 反爬虫策略 第三部分&#xff1a;爬虫实战项目 3.1 豆瓣…

【C语言】指针(二)

目录 一、传值调用和传址调用 二、数组名的理解 三、通过指针访问数组 四、一维数组传参的本质 五、指针数组 六、指针数组模拟实现二维数组 一、传值调用和传址调用 指针可以用在哪里呢&#xff1f;我们看下面一段代码&#xff1a; #include <stdio.h>void Swap(i…