本章介紹:輸入,輸出,文檔元數據定義,以及 併發請求時elastic處理的方案,批量索引文檔時如何快速索引的原理
- 輸入:增刪改
- 輸出:查詢
- 文檔的元數據:
_index
文檔在哪存放
_type
文檔表示的對象類別
_id
文檔唯一標識
- 併發衝突:
通常,我們的網站尤其在庫存方面,經常出現併發的請求導致 庫存出現負數:一個商品規格數量只有一件,這時候有兩個人同時下單,導致 1-2=-1, 儲存出現負數,那麼elasticsearch是怎麼處理呢?
一般數據庫的處理方式:悲觀併發控制,當讀取一行數據時候,給它鎖住,直到這行數據修改完畢才釋放鎖
elasticsearch的梳理方式:樂觀併發控制,利用版本號進行控制, 當我們調用接口 進行修改數據時候,這時候elasticsearch的_version屬性 會遞增,當出現兩個重複去修改數據的時候,指定的版本號 跟文檔的版本號不一致時候,就會返回錯誤信息.
悲觀併發控制:假設肯定會出現併發狀態
樂觀併發控制:假設不會出現併發狀況
- 批量索引文檔(插入數據):
看到一個有趣的大文件處理json的數據格式, good.json內容如下
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"[email protected]","city":"Brogan","state":"IL"}
elasticsearch是這樣思考的,由於不同的文檔(數據)會根據一個hash(id)%主分片數量 來決定這個 文檔 (索引)存放到哪個主分片上。
因此 不同的文檔 可能存在不同的分片上。
假如:每次讀取一個json文件,需要讀取完整個文件的內容,並且解析json數據時候,如果這個文件太大,內存受不了,而且垃圾回收代價太大了,而且也不利於把這些數據索引到不同的主分片上。
elasticsearch解析原理:根據\n 換行符,當讀取每小段時候,就解析json數據,並且索引到不同分片上,並且釋放內存。這時候既能快速的插入數據,也能減少服務器的壓力,減少延時.