安裝
使用 brew 安裝
brew install mongodb
運(yùn)行 MongoDB
1、首先我們創(chuàng)建一個(gè)數(shù)據(jù)庫存儲(chǔ)目錄 /data/db:
mkdir -p /data/db
2一膨、啟動(dòng)mongo
sudo mongo
http://localhost:8080/user/zhangsan
概述
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫呀邢。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案豹绪。
MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品价淌,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的瞒津。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散蝉衣,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型巷蚪。Mongo最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大病毡,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能屁柏,而且還支持對(duì)數(shù)據(jù)建立索引啦膜。
結(jié)構(gòu):MongoDB結(jié)構(gòu)分為:文檔(行)、集合(表)淌喻、數(shù)據(jù)庫僧家。
特性
事務(wù)
MongoDB 目前只支持單文檔事務(wù),需要復(fù)雜事務(wù)支持的場(chǎng)景暫時(shí)不適合裸删。
單文檔事務(wù)
在早期八拱,我們說的MongoDB支持事務(wù)是指針對(duì)MongoDB的單文檔級(jí)別,與我們MySQL等關(guān)系型數(shù)據(jù)庫中的事務(wù)是不同的涯塔,那什么是單文檔事務(wù)呢肌稻?
>db.username.update({'name': 'helei'}, {$set: {'age': 26, 'score': 85}})
上述命令對(duì)username集合中,name為helei列的行進(jìn)行更新伤塌,如果age更新為26灯萍,score由于宕機(jī)或其他原因?qū)е赂率。敲碝ongoDB則會(huì)回滾這一操作每聪。
Part2:單文檔ACID實(shí)現(xiàn)
MongoDB在更新單個(gè)文檔時(shí)旦棉,會(huì)對(duì)該文檔加鎖齿风,而要理解MongoDB的鎖機(jī)制,需要先了解以下幾個(gè)概念:
- Intent Lock绑洛, 意圖鎖表明讀寫方(reader-writer)意圖針對(duì)更細(xì)粒度的資源進(jìn)行讀取或?qū)懭氩僮骶劝摺@纾喝绻?dāng)某個(gè)集合被加了意向鎖,那么說明讀真屯、寫方意圖針對(duì)該集合中的某個(gè)文檔進(jìn)行讀或?qū)懙牟僮鳌?/li>
- MGL多粒度鎖機(jī)制(Multiple granularity locking )脸候,有S鎖(Shared lock), IS鎖(Intent Share lock), X鎖(Exclusive lock)绑蔫,IX鎖(Intent Exclusive lock)
MongoDB會(huì)為name為helei的文檔加上X鎖运沦,同時(shí)為包含該文檔的集合,數(shù)據(jù)庫和實(shí)例都加上意向?qū)戞i(IX)配深,這時(shí)携添,針對(duì)該文檔的操作就保證了原子性。
多文檔事務(wù)
MongoDB 4.0 將支持多文檔事務(wù)篓叶,屆時(shí)MongoDB將成為唯一能夠同時(shí)支持速度烈掠,靈活性,JSON文檔模型優(yōu)勢(shì)和ACID數(shù)據(jù)完整性保證的數(shù)據(jù)庫缸托。通過快照隔離左敌,(MongoDB)的事務(wù)能夠提供一個(gè)全局一致的數(shù)據(jù)視圖,并可以實(shí)現(xiàn)all-or-nothing的事務(wù)提交及回滾機(jī)制俐镐,保證數(shù)據(jù)的完整性矫限。
使用場(chǎng)景:
更高的寫入負(fù)載
默認(rèn)情況下,MongoDB更側(cè)重高數(shù)據(jù)寫入性能京革,而非事務(wù)安全奇唤,MongoDB很適合業(yè)務(wù)系統(tǒng)中有大量“低價(jià)值”數(shù)據(jù)的場(chǎng)景幸斥。但是應(yīng)當(dāng)避免在高事務(wù)安全性的系統(tǒng)中使用MongoDB匹摇,除非能從架構(gòu)設(shè)計(jì)上保證事務(wù)安全。
高可用性
MongoDB的復(fù)副集(Master-Slave)配置非常簡潔方便甲葬,此外廊勃,MongoDB可以快速響應(yīng)的處理單節(jié)點(diǎn)故障,自動(dòng)经窖、安全的完成故障轉(zhuǎn)移坡垫。這些特性使得MongoDB能在一個(gè)相對(duì)不穩(wěn)定(如云主機(jī))的環(huán)境中,保持高可用性画侣。
數(shù)據(jù)量很大或者未來會(huì)變得很大
依賴數(shù)據(jù)庫(MySQL)自身的特性冰悠,完成數(shù)據(jù)的擴(kuò)展是較困難的事,在MySQL中配乱,當(dāng)一個(gè)單達(dá)表到5-10GB時(shí)會(huì)出現(xiàn)明顯的性能降級(jí)溉卓,此時(shí)需要通過數(shù)據(jù)的水平和垂直拆分皮迟、庫的拆分完成擴(kuò)展,使用MySQL通常需要借助驅(qū)動(dòng)層或代理層完成這類需求桑寨。而MongoDB內(nèi)建了多種數(shù)據(jù)分片的特性伏尼,可以很好的適應(yīng)大數(shù)據(jù)量的需求。
基于位置的數(shù)據(jù)查詢
MongoDB支持二維空間索引尉尾,因此可以快速及精確的從指定位置獲取數(shù)據(jù)爆阶。
表結(jié)構(gòu)不明確,且數(shù)據(jù)在不斷變大
在一些傳統(tǒng)RDBMS中沙咏,增加一個(gè)字段會(huì)鎖住整個(gè)數(shù)據(jù)庫/表辨图,或者在執(zhí)行一個(gè)重負(fù)載的請(qǐng)求時(shí)會(huì)明顯造成其它請(qǐng)求的性能降級(jí)。通常發(fā)生在數(shù)據(jù)表大于1G的時(shí)候(當(dāng)大于1TB時(shí)更甚)肢藐。 因MongoDB是文檔型數(shù)據(jù)庫徒役,為非結(jié)構(gòu)貨的文檔增加一個(gè)新字段是很快速的操作,并且不會(huì)影響到已有數(shù)據(jù)窖壕。另外一個(gè)好處當(dāng)業(yè)務(wù)數(shù)據(jù)發(fā)生變化時(shí)忧勿,是將不在需要由DBA修改表結(jié)構(gòu)。
沒有DBA支持
如果沒有專職的DBA瞻讽,并且準(zhǔn)備不使用標(biāo)準(zhǔn)的關(guān)系型思想(結(jié)構(gòu)化鸳吸、連接等)來處理數(shù)據(jù),那么MongoDB將會(huì)是你的首選速勇。MongoDB對(duì)于對(duì)像數(shù)據(jù)的存儲(chǔ)非常方便晌砾,類可以直接序列化成JSON存儲(chǔ)到MongoDB中。 但是需要先了解一些最佳實(shí)踐烦磁,避免當(dāng)數(shù)據(jù)變大后养匈,由于文檔設(shè)計(jì)問題而造成的性能缺陷。
示例:京東的留言系統(tǒng)
Tailable Cursors
MongoDB 有一個(gè)叫 Tailable Cursors的特性都伪,它類似于tail -f 命令呕乎,你在一個(gè)Capped Collection上面執(zhí)行查詢操作,當(dāng)操作完成后陨晶,你可以不關(guān)閉返回的數(shù)據(jù)Cursor猬仁,并持續(xù)地從中讀出新加入的數(shù)據(jù)。
In MongoDB tailable cursors can only be opened on capped collections. This is because a capped collection is a fixed size and only allows insertions. This means that once the number of documents exhausts the collection size, newly written documents will start overwriting the first inserted documents.
在高寫入的 固定集合(Capped Collection)上先誉,索引不可用時(shí)湿刽,可使用Tailable Cursors。例如褐耳,MongoDB復(fù)制使用了Tailable Cursors來獲取Primary的尾oplog日志诈闺。
考慮以下與Tailable Cursors相關(guān)的行為:
- Tailable Cursors不使用索引,并以自然排序返回文檔铃芦。
- 因?yàn)門ailable Cursors不使用索引雅镊,查詢的初始掃描非常耗性能把曼;但是,游標(biāo)初始化完后漓穿,隨后獲取到的新增加的文檔是很快速的嗤军。
- Tailable Cursors如果遇到以下情況之一將會(huì)僵死或無效:
(1)查詢無匹配結(jié)果。
(2)游標(biāo)在集合尾部返回文檔晃危,隨后應(yīng)用程序刪除了該文檔叙赚。
僵死的游標(biāo)id為0。
cursor.tailable() — MongoDB Manual
http://shtylman.com/post/the-tail-of-mongodb/
public interface MyEventRepository extends ReactiveMongoRepository<MyEvent, Long> {
@Tailable
Flux<MyEvent> findBy();
}
參考:
MongoDB CRUD Operations — MongoDB Manual
別再用 MongoDB 了僚饭! - 開源中國