国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題??!

這篇具有很好參考價值的文章主要介紹了解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題!!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

先說一下什么是數(shù)據(jù)庫數(shù)據(jù)庫中并發(fā)一致性問題!

1、在并發(fā)環(huán)境下,事務(wù)的隔離性很難保證,因此會出現(xiàn)很多并發(fā)一致性問題。

  • 數(shù)據(jù)丟失
    T1 和 T2 兩個事務(wù)都對一個數(shù)據(jù)進(jìn)行修改,T1 先修改,T2 隨后修改,T2 的修改覆蓋了 T1 的修改。
    解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題??!
  • 讀臟數(shù)據(jù)
    T1 修改一個數(shù)據(jù),T2 隨后讀取這個數(shù)據(jù)。如果 T1 撤銷了這次修改,那么 T2 讀取的數(shù)據(jù)是臟數(shù)據(jù)。
    解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題?。? referrerpolicy=
  • 不可重復(fù)讀
    T2 讀取一個數(shù)據(jù),T1 對該數(shù)據(jù)做了修改。如果 T2 再次讀取這個數(shù)據(jù),此時讀取的結(jié)果和第一次讀取的結(jié)果不同。
    解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題?。? referrerpolicy=
  • 幻影讀
    T1 讀取某個范圍的數(shù)據(jù),T2 在這個范圍內(nèi)插入新的數(shù)據(jù),T1 再次讀取這個范圍的數(shù)據(jù),此時讀取的結(jié)果和和第一次讀取的結(jié)果不同。

當(dāng)然上面只是提一下什么是一致性的問題。

現(xiàn)在就用一個在開發(fā)中的實(shí)際例子來說一下ES中多線程的情況下如何避免不一致性的問題。
這里我使用了批量更新數(shù)據(jù)的一個例子;
業(yè)務(wù): 前端發(fā)送任務(wù)后,將ES中所有符合條件的數(shù)據(jù)的某一個字段全部更新一遍。由于數(shù)據(jù)量太大,所以準(zhǔn)備使用多線程的方式去執(zhí)行。例如前端發(fā)送了兩個任務(wù),這就代表我需要去更新兩次。但是如果使用多線程就會導(dǎo)致最后一次更新完的數(shù)據(jù)可能將第一次更新的部分?jǐn)?shù)據(jù)覆蓋。

在多線程情況下,更新 Elasticsearch 數(shù)據(jù)庫可能會導(dǎo)致并發(fā)一致性問題。這意味著,如果多個線程同時訪問數(shù)據(jù)庫并進(jìn)行更新操作,可能會導(dǎo)致沖突,從而使數(shù)據(jù)庫的狀態(tài)混亂不堪。

為了解決這個問題,可以使用 Elasticsearch 的沖突解決機(jī)制。這包括使用版本號來跟蹤文檔的更新,并在更新操作時使用比較-替換模式(compare-and-swap)。
例如,假設(shè)你有一個文檔,其中包含一個版本號字段:

	{
	  "title": "My Document",
	  "description": "This is my document",
	  "version": 1
	}

當(dāng)你想要更新這個文檔時,可以使用 version 字段來進(jìn)行并發(fā)控制。例如,假設(shè)你想要更新文檔的 description 字段:


POST my_index/my_type/123/_update
{
  "doc": {
    "description": "This is an updated description"
  },
  "version": 1
}

這將會檢查文檔的當(dāng)前版本是否為 1,并只有在版本匹配的情況下才會執(zhí)行更新操作。如果文檔的版本已被更新,則會返回沖突錯誤。

在 Java 中使用 Elasticsearch 的 HighLevelRestClient 實(shí)現(xiàn)版本號控制時,可以使用 UpdateRequest 類來創(chuàng)建更新請求。該請求可以使用 setIfSeqNo(long) 和 setIfPrimaryTerm(long) 方法來設(shè)置版本號。
例如,假設(shè)你想要更新文檔的 description 字段,并且想要使用版本號進(jìn)行并發(fā)控制:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));

UpdateRequest request = new UpdateRequest("my_index", "my_type", "123")
  .doc("description", "This is an updated description")
  .setIfSeqNo(1)
  .setIfPrimaryTerm(1);

client.update(request);

這將會檢查文檔的當(dāng)前版本是否為 1,并只有在版本匹配的情況下才會執(zhí)行更新操作。如果文檔的版本已被更新,則會返回沖突錯誤。

如果多次請求更新我怎么知道版本號具體設(shè)置多少?

在獲取文檔時獲取版本號。可以使用 GetRequest.fetchSourceContext(FetchSourceContext) 方法來獲取文檔的版本號。例如:

GetRequest request = new GetRequest("my_index", "my_type", "123")
  .fetchSourceContext(new FetchSourceContext(true, new String[]{"_seq_no", "_primary_term"}, null));

GetResponse response = client.get(request);
long seqNo = response.getSeqNo();
long primaryTerm = response.getPrimaryTerm();

在執(zhí)行更新操作時使用 Get 操作獲取版本號。在執(zhí)行更新操作之前,可以使用 Get 操作獲取文檔的版本號,然后將版本號設(shè)置到更新請求中。例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-439810.html

GetRequest getRequest = new GetRequest("my_index", "my_type", "123")
  .fetchSourceContext(new FetchSourceContext(true, new String[]{"_seq_no", "_primary_term"}, null));
//在執(zhí)行前獲取版本號
GetResponse getResponse = client.get(getRequest);
long seqNo = getResponse.getSeqNo();
long primaryTerm = getResponse.getPrimaryTerm();
//設(shè)置版本號
UpdateRequest updateRequest = new UpdateRequest("my_index", "my_type", "123")
  .doc("description", "This is an updated description")
  .setIfSeqNo(seqNo)
  .setIfPrimaryTerm(primaryTerm);

client.update(updateRequest);

到了這里,關(guān)于解決在使用 Elasticsearch(ES)多線程批量操作時導(dǎo)致并發(fā)一致性的問題??!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用python對ES進(jìn)行批量操作

    使用python對ES進(jìn)行批量操作

    在kibana中進(jìn)行批量操作:? 使用python代碼進(jìn)行對es進(jìn)行批量操作 示例代碼: 運(yùn)行結(jié)果: 案例一: python讀取mysql數(shù)據(jù)寫入ES: 參考博文:https://www.jianshu.com/p/c0e42121f054 python 批量導(dǎo)入mysql數(shù)據(jù)到Elastic Search_追逐時光的博客-CSDN博客? 參考博文: Python簡單實(shí)現(xiàn)與ElasticSearch交互插入

    2024年02月13日
    瀏覽(16)
  • Java使用線程池批量處理數(shù)據(jù)操作

    Java使用線程池批量處理數(shù)據(jù)操作

    疑問思路: 1.如何保證數(shù)據(jù)按順序批量處理 2.如何保證數(shù)據(jù)全部處理完統(tǒng)一返回 3.如何保證是多任務(wù)異步操作 4.如何提高運(yùn)行效率,減少運(yùn)行時間 1.使用ArrayList 插入數(shù)據(jù)有序且可重復(fù) 2.CountDownLatch / Future / CompletableFuture 3.多線程 4.線程池創(chuàng)建多線程 具體流程: 獲取需要進(jìn)行批

    2024年02月09日
    瀏覽(20)
  • C++并發(fā)線程 - 如何線程間共享數(shù)據(jù)【詳解:如何使用鎖操作】

    C++并發(fā)線程 - 如何線程間共享數(shù)據(jù)【詳解:如何使用鎖操作】

    點(diǎn)擊進(jìn)入系列文章目錄 C++技能系列 Linux通信架構(gòu)系列 C++高性能優(yōu)化編程系列 深入理解軟件架構(gòu)設(shè)計系列 高級C++并發(fā)線程編程 期待你的關(guān)注哦!??! 快樂在于態(tài)度,成功在于細(xì)節(jié),命運(yùn)在于習(xí)慣。 Happiness lies in the attitude, success lies in details, fate is a habit. 具體哪個線程按何種

    2024年02月08日
    瀏覽(26)
  • C# 使用屏障來使多線程并發(fā)操作保持同步

    C# 使用屏障來使多線程并發(fā)操作保持同步

    以下是微軟官方對屏障類的介紹,System.Threading.Barrier 可用來作為實(shí)現(xiàn)并發(fā)同步操作的基本單元,讓多個線程(參與者)分階段并行處理目標(biāo)算法。在達(dá)到代碼中的屏障點(diǎn)之前,每個參與者將繼續(xù)執(zhí)行,屏障表示工作階段的末尾;單個參與者到達(dá)屏障后將被阻止,直至所有參與者

    2024年01月24日
    瀏覽(23)
  • 使用Elasticsearch進(jìn)行數(shù)據(jù)批量操作

    Elasticsearch是一個開源的搜索和分析引擎,基于Lucene庫開發(fā)。它可以用來實(shí)現(xiàn)文本搜索、數(shù)據(jù)分析、實(shí)時數(shù)據(jù)處理等功能。在大數(shù)據(jù)時代,Elasticsearch成為了處理和分析大量數(shù)據(jù)的首選工具之一。 數(shù)據(jù)批量操作是Elasticsearch中的一種常見操作,它可以用來對大量數(shù)據(jù)進(jìn)行創(chuàng)建、更

    2024年02月22日
    瀏覽(29)
  • 多線程批量同步數(shù)據(jù)到ES

    需求背景:新增了ES,現(xiàn)在要講數(shù)據(jù)庫某張表的數(shù)據(jù)同步到ES中,百萬級的數(shù)據(jù)量一次性讀取同步肯定不行,所以可以用多線程同步執(zhí)行同步數(shù)據(jù)。 1.線程池配置類 2.ES配置類 3.主要代碼邏輯

    2024年01月24日
    瀏覽(23)
  • 項目中使用es(一):使用springboot操作elasticsearch

    項目中使用es(一):使用springboot操作elasticsearch

    寫在前面 對于elasticsearch的搭建,前面寫了一篇文章有簡單描述如何搭建es,本次主要介紹如何在項目里使用,主要使用ElasticsearchRepository和ElasticsearchRestTemplate操作es。 搭建項目環(huán)境和選擇合適版本 首先選擇合適的項目組件版本,因?yàn)閑s版本和springboot版本有對應(yīng),如果不合適會

    2024年02月08日
    瀏覽(25)
  • 項目中使用es(二):使用RestHighLevelClient操作elasticsearch

    寫在前面 之前寫了有關(guān)elasticsearch的搭建和使用springboot操作elasticsearch,這次主要簡單說下使用RestHighLevelClient工具包操作es。 搭建環(huán)境和選擇合適的版本 環(huán)境還是以springboot2.7.12為基礎(chǔ)搭建的,不過這不重要,因?yàn)檫@次想說的是RestHighLevelClient操作elasticsearch,RestHighLevelClient版本

    2024年02月14日
    瀏覽(25)
  • Elasticsearch學(xué)習(xí)3-使用RestClient操作es

    JavaREST客戶端有兩種模式: Java Low Level REST Client:ES官方的低級客戶端。低級別的客戶端通過http與Elasticearch集群通信。 Java High Level REST Client:ES官方的高級客戶端?;谏厦娴牡图壙蛻舳耍彩峭ㄟ^HTTP與ES集群進(jìn)行通信。它提供了更多的接口。 此外Spring也對RestClient進(jìn)行了封裝

    2024年02月11日
    瀏覽(20)
  • ES中同時使用should和must導(dǎo)致只有must生效解決方案

    背景:es嵌套查詢,條件a等于某一個值且條件b等于某兩個值甚至更多。 第一步:單獨(dú)條件b采用 should 匹配多個值,可以查到預(yù)期的結(jié)果,代碼如下: 第二步:單獨(dú)條件a采用must匹配單個值,也可以查到預(yù)期的結(jié)果,代碼如下: 第三步:合并起來查詢,a和b條件同時啟用,代

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包