热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch处理并发读写操作

文章目录1.并发控制的必要性2.ES的乐观并发控制3.demo1.并发控制的必要性两个Web程序同时更新某个文档,如果缺乏有效的并发,会导致更改的数据

文章目录

    • 1. 并发控制的必要性
    • 2. ES 的乐观并发控制
    • 3. demo




1. 并发控制的必要性

两个 Web 程序同时更新某个文档,如果缺乏有效的并发,会导致更改的数据丢失
悲观并发控制

  • 假设有变更冲突的可能,会对资源加锁,防止冲突。例如数据库行锁

乐观并发控制

  • 假设突然是不会发生的,不会阻塞正在尝试的操作。如果数据在读写中被修改,更新将会失败。应用程序决定如何解决冲突,例如重试更新,使用新的数据,或者将错误报告给用户
  • ES 采用的乐观并发控制
    在这里插入图片描述

2. ES 的乐观并发控制

ES 中的文档是不可变更的。如果你更新一个文档,会将会文档标记为删除,同时增加一个全新当文档,同时文档的 version 字段加 1
内部版本控制

  • If_seq_no + If_primary_term

使用外部版本(使用其他数据库作为主要数据存储)

  • version + version_type = external

在这里插入图片描述

3. demo

DELETE products
PUT products
PUT products/_doc/1
{"title":"iphone","count":100
}
返回输出:
{"_index" : "products","_type" : "_doc","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0, "_primary_term" : 1
}GET products/_doc/1
{"_index" : "products","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"title" : "iphone","count" : 100}
}//只能执行一次
PUT products/_doc/1?if_seq_no=0&if_primary_term=1
{"title":"iphone","count":110
}返回输出:_seq_no增1
{"_index" : "products","_type" : "_doc","_id" : "1","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1
}#如果默认另外一个人查询
PUT products/_doc/1?if_seq_no=0&if_primary_term=1
{"title":"iphone","count":113
}
返回输出:报错
{"error": {"root_cause": [{"type": "version_conflict_engine_exception","reason": "[1]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid": "V8OgL-0mQq6WST217HUCgA","shard": "0","index": "products"}],"type": "version_conflict_engine_exception","reason": "[1]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid": "V8OgL-0mQq6WST217HUCgA","shard": "0","index": "products"},"status": 409
}//数据库版本号为主
PUT products/_doc/1?version=23&version_type=external
{"title":"iphone","count":130
}返回输出:
{"_index" : "products","_type" : "_doc","_id" : "1","_version" : 23,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}#查询GET products/_doc/1
返回输出:
{"_index" : "products","_type" : "_doc","_id" : "1","_version" : 23,"_seq_no" : 2,"_primary_term" : 1,"found" : true,"_source" : {"title" : "iphone","count" : 130}
}


推荐阅读
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 16.04 系统上配置 Qt 5.5 的交叉编译环境,特别针对 i.MX6 平台进行了优化设置。内容涵盖从基本的软件安装到高级配置的全过程。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 本文探讨了在一个使用Mongoid框架的项目中,如何处理当HABTM(has_and_belongs_to_many)关系中的逆向关联设置为nil时,子对象无法正确持久化的问题。 ... [详细]
  • 深入体验Python的高级交互式Shell - IPython
    IPython 是一个增强型的 Python 交互式 Shell,提供了比标准 Python 控制台更为强大的功能,适用于开发和调试过程。它不仅支持直接执行 Linux 命令,还提供了丰富的特性来提高编程效率。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
author-avatar
go800li
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有