已解决 - Elasticsearch 操作更新数据后,没有立即生效问题
2023-03-31 10:37:13 时间
- 问题描述:
SpringBoot 项目使用 RestHighLevelClien 操作ES修改数据成功,之后前端调用查询接口发现数据并未更新,待1S左右再次刷新发现ES数据成功更新。
从现象来看是ES操作后存在延迟。 - 问题原因
这个问题是Elasticsearch本身在操作数据后有一定的延迟性导致。Elasticsearch默认情况下在写入数据后,是要等1s后才能被查询到。
因为Elasticsearch中每次索引refresh
会产生一个新的 lucene 段,这会导致频繁的segment merge
行为,对系统 CPU 和 IO 占用都比较高。 - 解决方案
- 方案1:代码中指定setRefreshPolicy的刷新策略,使用立即刷新策略IMMEDIATE方式提交请求。
1 public static enum RefreshPolicy implements Writeable {
2 NONE("false"), 3 IMMEDIATE("true"), 4 WAIT_UNTIL("wait_for"); 5 }- IMMEDIATE:
请求想ES提交了数据,立即刷新数据再结束请求
优点:实时性最高,实时性最高
缺点:消耗资源高 - WAIT_UNTIL
请求向ES提交数据,等待1S(默认)后结束请求,数据刷新。
优点:实时性相对较高
缺点:资源消耗低 - NONE(默认策略)
请求向ES提交数据,不等待数据完成刷新,直接结束请求。
优点:操作延时短,资源消耗低
缺点:实时性低 - 支持的接口:
删除:DeleteRequestBuilder
新增:IndexRequestBuilder
更新:UpdateRequestBuilder
批量:BulkRequestBuilder
- IMMEDIATE:
- 方案2:前端后后端,使用sleep的方式延迟调用API,等待ES数据更新后再进行请求
- 方案1:代码中指定setRefreshPolicy的刷新策略,使用立即刷新策略IMMEDIATE方式提交请求。
相关文章
- 微软终补短板:Windows 11效率更高 提高文件管理器性能
- Windows 11新预览版进一步提高文件管理器的性能
- 微软 Azure Database for MySQL Flexible Server 在中国大陆地区正式上线:完全托管的数据库服务
- Docker 系列教程:轻松在 Docker 容器中运行 MySQL 图文指南
- PageAbility跨设备迁移开发实战—问答互动
- 更换电脑不用怕,可以轻松将Windows 10密钥转移到新计算机上
- OpenHarmony 源码解析之分布式数据库
- 如何快速定位数据库消耗CPU语句?
- Explain进行索引分析和优化
- 有趣的 Events_Statements_Current 表问题
- 故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
- 这可能是Spring Boot Starter 讲的最清楚的一次了
- 又是一年跳槽季!如何快速定位数据库消耗CPU语句?
- MySQL千万级数据查询的优化技巧及思路
- 一文读懂MySQL分库分表的实现原理和策略
- MySQL:两张表编码方式不一致,关联查询一定会导致索引失效吗?
- Redis常用操作命令整理
- 梅科尔HOS-openGauss数据库安装使用(openEuler服务器)
- 使用 Vector 将 PostgreSQL 日志输出为 Prometheus 指标
- 关于微信数据库的解密以及取证