日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

CouchDB

發(fā)布時(shí)間:2025/4/14 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CouchDB 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

couchDB是這兩年很受geek追捧的數(shù)據(jù)庫,作者曾是lotus開發(fā)人員。與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫不同, 它號(hào)稱自己是文檔數(shù)據(jù)庫。所謂文檔數(shù)據(jù)庫,并不是說它只能存儲(chǔ)文本,事實(shí)上因?yàn)樗且环Nschemal-less的概念。用過關(guān)系型數(shù)據(jù)庫的同學(xué)都知道, 數(shù)據(jù)表里定義的每一個(gè)字段都定義為一種類型:無論是int,char,datetime。但couchDB的字段只有三個(gè):文檔ID、文檔版本號(hào)和內(nèi)容。 內(nèi)容字段可以看到是一個(gè)text類型的文本,里面可以隨意定義數(shù)據(jù),而不用關(guān)注數(shù)據(jù)類型,但數(shù)據(jù)必須以json的形式表示并存放。例如一個(gè)表述用戶的文檔 可以表示為:[_id:1001, _rev:1-32443289, {'name':'wentrue', 'location':'beijing'}]。couchDB的底層是erlang語言,以RESTful API的格式提供服務(wù),couchDB所有的讀寫能力都可以通過簡(jiǎn)單的調(diào)用它的HTTP請(qǐng)求來實(shí)現(xiàn)。正因?yàn)椴捎媚敲匆环N統(tǒng)一且簡(jiǎn)潔的服務(wù)接口,可以很方便地開發(fā)各種語言的客戶端,以方便不同程序員的使用。

couchDB的文檔不多,基本上主體都在它網(wǎng)站的overview和wiki了。這里按照我的理解組織一遍,不敢冒”大全“之名,借”小全“一用尚可。 以下以幾個(gè)關(guān)鍵詞為標(biāo)簽簡(jiǎn)要敘述。

優(yōu)點(diǎn):

couchDB的主要特點(diǎn)在于易用性及并發(fā)性。后者我的認(rèn)識(shí)主要是來自erlang,因?yàn)閑rlang是以易并行實(shí)現(xiàn)而著稱的,我自己并沒有測(cè)試 過。但對(duì)于易用性我是有著深刻體會(huì)。只要一搭好服務(wù),你不但擁有了一個(gè)聽任你調(diào)遣的數(shù)據(jù)服務(wù)端,還擁有一個(gè)簡(jiǎn)潔web server,如果你是在本地部署的,在瀏覽器上訪問http://localhost:5984/_utils/,你就可以看到一個(gè)管理與查詢的后臺(tái), 在那個(gè)后臺(tái),你基本能實(shí)現(xiàn)用其它客戶端能實(shí)現(xiàn)的所有事情。也就是說,即便你不懂編程語言,你可以在這個(gè)管理平臺(tái)自由發(fā)揮,當(dāng)然如果你懂一些 javascript,那你就可以把couchDB玩轉(zhuǎn)了。

這個(gè)易用性意味著什么?讓我們作個(gè)假設(shè),你是一個(gè)網(wǎng)站開發(fā)人員,你有大量的數(shù)據(jù)需要存儲(chǔ),但你又不想跟復(fù)雜的后臺(tái)邏輯打交道,或許你還不想過多地進(jìn) 行后臺(tái)維護(hù),那么用couchDB,你可以直接用js調(diào)用數(shù)據(jù),然后結(jié)合html+css把數(shù)據(jù)展現(xiàn)出來,再通過js把數(shù)據(jù)寫回去,這就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的內(nèi)容發(fā)布系統(tǒng),沒有任何后臺(tái)架構(gòu)。實(shí)際上已經(jīng)有很多用couchDB實(shí)現(xiàn)的網(wǎng)站。

技術(shù)概述:

couchDB的底層是一個(gè)B-tree的存儲(chǔ)結(jié)構(gòu),為提高效率,所有的數(shù)據(jù)的插入或更新都是直接在樹的葉子節(jié)點(diǎn)添加,不刪除舊節(jié)點(diǎn),通過版本號(hào)來 確定最新的數(shù)據(jù)--版本號(hào)還能用來解決并發(fā)寫的沖突。所以數(shù)據(jù)文件會(huì)越來越大,可以在適當(dāng)?shù)貢r(shí)間運(yùn)行compact過程或replication過程,會(huì) 刪除舊文件,使得數(shù)據(jù)文件得到壓縮。

與mysql的對(duì)比(是什么原因促使我把眼光暫時(shí)離開mysql):

1、couchDB的屬性可以靈活增刪,要增加一個(gè)新屬性只需要往數(shù)據(jù)字段多寫入一個(gè)屬性即可。mysql在數(shù)據(jù)量大了之后,再增刪字段會(huì)比較耗費(fèi) 時(shí)間,在線操作更是讓人難以忍受的(視數(shù)據(jù)量大小有可能要鎖表幾十分鐘到一天);

2、文檔間屬性的不一致,如有些記錄可能有A屬性而有一些沒有,用mysql則只能把沒有該屬性的用戶的值置為0或空,影響存儲(chǔ)與查詢;

3、 查詢效率,經(jīng)常會(huì)需要對(duì)某個(gè)字段進(jìn)行查詢,得到某個(gè)滿足條件的子集,用mysql要對(duì)每個(gè)字段的查詢都達(dá)到高效只能采用對(duì)該字段建索引的辦法,使得索引文 件變大,如果新增字段又要新建索引,建立索引也是一個(gè)鎖表又冗長(zhǎng)的過程。couchDB應(yīng)用map-reduce的方法使得計(jì)算量可以分散(注意:跟 google的那個(gè)不太一樣,這里的map-reduce實(shí)際上還是在一臺(tái)機(jī)器完成,且沒有發(fā)現(xiàn)多個(gè)進(jìn)程,沒有看到線程個(gè)數(shù)的配置,這是我感到最難解的, 難道還是單線程流水處理的?),雖然也是像沒有建索引的mysql一樣需要掃全表,但可以對(duì)常用的一些查詢建立永久索引,索引是隨數(shù)據(jù)的增長(zhǎng)增量更新的, 減少查詢時(shí)間。

數(shù)據(jù)格式:

couchDB以json格式存儲(chǔ)數(shù)據(jù),返回的數(shù)據(jù)也默認(rèn)為json格式,這對(duì)于前端的javascript處理是非常方便的。然而如果你用其它的 語言,比如python,獲取回來的數(shù)據(jù)量很大,用simplejson包去把這個(gè)龐大的json字符串解釋為dict,這就有點(diǎn)費(fèi)時(shí)間了。解決方法之一 是升級(jí)你的simplejson到最新版本,這樣速度可以提升幾倍,或者你用cjson,這樣格式轉(zhuǎn)換的時(shí)間就基本可以忽略不計(jì)。但cjson的接口與處 理跟simplejson有點(diǎn)不太一樣,如果你用couchdb-python作為客戶端,需要對(duì)客戶端代碼作修改。另一個(gè)方法是要求服務(wù)端直接返回 list格式的數(shù)據(jù),然后直接在python解釋,避過了json解釋一關(guān),速度應(yīng)該保證。list格式請(qǐng)求的API可以看這里。

緩存:

應(yīng)該是有緩存的,因?yàn)橥瑯拥牟樵?#xff0c;第二次再查時(shí)會(huì)比第一次快不少,在couchDB的數(shù)據(jù)目錄也能看到查詢生成的臨時(shí)文件。不過我估計(jì)主要的數(shù)據(jù)還 是在硬盤,因?yàn)閏ouchDB服務(wù)占內(nèi)存不多,數(shù)據(jù)不太可能都在里面,而且依據(jù)第二次查詢的速度來看,不像是直接從內(nèi)存取出來的,倒像是從硬盤現(xiàn)成拿數(shù)據(jù) 的速度。

更新機(jī)制(如何保持?jǐn)?shù)據(jù)一致性):

上面說到couchDB每個(gè)文檔有三個(gè)字段,其中_rev代表該文檔的版本號(hào),數(shù)據(jù)每更新一次,文檔的版本號(hào)也會(huì)更新一次。這個(gè)版本號(hào)對(duì)于保持?jǐn)?shù)據(jù) 一致性有很重大的作用。上面談到couchDB把所有的屬性忽略schema都統(tǒng)一放在一個(gè)字段里,那么當(dāng)有兩個(gè)程序同時(shí)修改這個(gè)字段時(shí),就有可能造成先 寫入的數(shù)據(jù)被后寫入的數(shù)據(jù)覆蓋的現(xiàn)象,導(dǎo)致數(shù)據(jù)不一致。couchDB利用版本號(hào)來解決這個(gè)問題,當(dāng)有程序需要修改一條數(shù)據(jù)時(shí),它必須先把這個(gè)數(shù)據(jù)的版本 號(hào)讀出來,寫入的時(shí)候,連版本號(hào)一并寫入,此時(shí)couchDB會(huì)檢查該版本號(hào)是否與原數(shù)據(jù)的一致,如果一致則寫入,如果不一致,則說明數(shù)據(jù)在該程序讀出后 已經(jīng)被修改過,couchDB會(huì)寫入不成功,返回一個(gè)沖突的信號(hào),待客戶端程序處理。

分布式:

現(xiàn)在couchDB(<1.0)并沒有內(nèi)置分布式處理機(jī)制。所以,官網(wǎng)中提倡的分布式并保持?jǐn)?shù)據(jù)一致性的解決方法是:你設(shè)置一個(gè)寫的 couchDB服務(wù),然后把這份數(shù)據(jù)用replication過程同步拷貝到其它的機(jī)器,作為讀服務(wù)。這樣的分布式聽起來有點(diǎn)傻,但確實(shí)就是如此。所以, 信息的一致性其實(shí)是難以保證的,也即是說,你剛在網(wǎng)站上發(fā)布了一個(gè)信息,刷新之后可能并不會(huì)馬上就能看到它。不知道將來couchDB的開發(fā)者會(huì)不會(huì)就這 方面進(jìn)行努力,至少現(xiàn)在看到的計(jì)劃是還沒有包含更多的分布式支持。

穩(wěn)定性:

在網(wǎng)上的介紹中,穩(wěn)定性是作為它的一個(gè)feature來介紹的,但我在gentoo上直接用portage裝的couchDB0.9服務(wù)一周之內(nèi)莫 名其妙地消失了三次,且在日志里沒有留下任何蜘絲馬跡。所以我對(duì)此持保留態(tài)度。

python客戶端:

因?yàn)樘峁┝撕?jiǎn)易的RESTful接口,為couchDB寫各種語言的客戶端可就容易多了,這里列出了大量的客戶端。python客戶端主要有 couchdb-python和couchdbkit,我試驗(yàn)中主要是使用了前者,使用中的問題是json的解釋效率。如果使用python自帶的 simplejson或json(>2.5)模塊來解釋,碰上一個(gè)大的字符串或dict,你就只能痛苦地等待了。我最初就是以為couchDB極 慢,誰想其實(shí)是json解釋占了大部分的時(shí)間。要解決這個(gè)問題,可以裝cjson,很快,但需要對(duì)couchdb-python的源代碼作改動(dòng);另一個(gè)選 擇是升級(jí)simplejson到最新版,速度會(huì)有極大的提升。

couchDB要做什么(它的能與不能):

即使解決了json解釋的問題,純粹歸究到couchDB的問題時(shí),你可不能對(duì)它的大數(shù)據(jù)量讀寫抱有太大的信心,畢竟它設(shè)計(jì)的初衷是前臺(tái)的并發(fā)應(yīng) 用,并不是要讓你一次讀出或更新幾百萬條數(shù)據(jù)。我的試驗(yàn)結(jié)果是,讀200W的數(shù)據(jù)(每條記錄并不大),第一次查詢大概幾分鐘,第二次一分鐘左右,更新 200W條記錄,你需要等待大于20分鐘。所以,目前為止,如果你要作后臺(tái)批量讀寫,并且不能忍受這個(gè)速率,它可不是一個(gè)最好的選擇。同時(shí)在你更新數(shù)據(jù)的 過程中,數(shù)據(jù)文件的體積會(huì)逐漸變大,因?yàn)閿?shù)據(jù)都是追加到文件末尾的,舊數(shù)據(jù)并沒有刪除,所以用couchDB必須預(yù)備較大的硬盤空間,并且要定時(shí)運(yùn)行 compact或replication過程,通過壓縮或拷貝來清除舊數(shù)據(jù)。

前景:

這兩年couchDB備受追捧,社區(qū)非常活躍,通常社區(qū)的活躍程度是影響一個(gè)開源軟件成敗的關(guān)鍵因素。couchDB吸引人的關(guān)鍵之處當(dāng)然在于它提 出了一些對(duì)web數(shù)據(jù)存儲(chǔ)與索引的很好的方案,如果把關(guān)系型數(shù)據(jù)庫看作是一批有固定格式的電子表格的集合,那么文檔型數(shù)據(jù)庫就是一批各色各樣的文檔的集 合。相對(duì)于關(guān)系型數(shù)據(jù)庫而言,文檔數(shù)據(jù)庫顯然更適合用于多樣而靈活的web數(shù)據(jù)。而couchDB的簡(jiǎn)易入門,體系的簡(jiǎn)單化,又很符合geeks追求簡(jiǎn)潔 的夠用的想法。couchDB的宣傳中說它“l(fā)ike a porn star”也是挺傳神的。所以我比較看好他的發(fā)展,看到1.0穩(wěn)定版會(huì)是個(gè)什么樣子吧,這注定是一個(gè)跟web聯(lián)系緊密的數(shù)據(jù)庫。

我個(gè)人比較企盼它能在分布式處理方面有更多的改進(jìn),還有就是服務(wù)的配置、查詢的效率,都是有待提高的。至于大數(shù)據(jù)量的處理,我不太難期待,因?yàn)榭磥?它應(yīng)該是個(gè)網(wǎng)站前臺(tái)的產(chǎn)品,而不太適合用于后臺(tái)的分析。

參考文檔

1、couchDB官方網(wǎng)站:http://couchdb.apache.org/

2、couchDB wiki:http://wiki.apache.org/couchdb/

3、couchDB上手指南:http://erlang-china.org/study/couchdb-guide.html

轉(zhuǎn)載于:https://www.cnblogs.com/roverland/archive/2011/12/28/1903656.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的CouchDB的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。