couchbase的簡單介紹

来源:http://www.cnblogs.com/kuiyu/archive/2016/04/30/5449572.html
-Advertisement-
Play Games

couchbase作為新興的NOSQL資料庫,可堪使用的資料少的可憐,更別提中文資料了,基本上就是在官網的手冊和論壇上查詢所需資料,所以這要求有一定的英語基礎,辭彙量不是問題,不認識的直接百度,關鍵是語法和耐心要過關,我從剛接觸couchbase開始天天啃英文手冊也是讀得煩躁不安,所以耐心十分重要。 ...


 

couchbase作為新興的NOSQL資料庫,可堪使用的資料少的可憐,更別提中文資料了,基本上就是在官網的手冊和論壇上查詢所需資料,所以這要求有一定的英語基礎,辭彙量不是問題,不認識的直接百度,關鍵是語法和耐心要過關,我從剛接觸couchbase開始天天啃英文手冊也是讀得煩躁不安,所以耐心十分重要。現在使用的是couchbase 2.2 community版本的,所以手冊是這個:http://docs.couchbase.com/couchbase-manual-2.2/。這個手冊中,Best Practices 與 Administrators Tasks是關於配置上的說明,Views and Indexs是關於構建數據關係的說明,這三個是最優先需要閱讀的章節。Command-line Interface for Administration是講解配置參數的工具,當具體要配置參數時應仔細閱讀這一章節。

如果以前沒有nosql的經驗,那麼理解couchbase的時候關鍵有兩點:延後寫入和鬆散存儲。延後寫入,顧名思義,couchbase在對數據進行增刪時會先體現在記憶體中,而不會立刻體現在硬碟上,從記憶體的修改到硬碟的修改這一步驟是由couchbase自動完成,等待執行的硬碟操作會以write queue的形式排隊等待執行,也正是通過這個方法,硬碟的I/O效率在write queue滿之前是不會影響couchbase的吞吐效率的,而write queue的長度是可以設置的。鬆散存儲也很好理解,在關係型資料庫中,要先建庫建表,最後插數據,而在couchbase中,bucket就相當於庫,沒有表的存在,直接就插數據了。關係型資料庫依賴表來進行條件查詢,couchbase一開始沒有具備表功能的結構,所以是無法執行條件查詢的,但是通過view則可以手動添加所需要的關係,view的設置是非常複雜的一部分,詳情去manul里Views and indexs里學習。總之couchbase的一般邏輯是建bucket——>插入數據——>建立View。正是因為關係可以後天建立,才使得不必預先規劃數據應具備的關係,隨用隨建即可。當然,對couchbase而言插入數據其實是插入json格式的文件。

接下來聊聊couchbase的記憶體。對於couchbase來說配置記憶體是很重要的環節,因為couchbase的精髓就在於依賴記憶體最大化降低硬碟I/O對吞吐量的負面影響。記憶體資源肯定遠遠少於硬碟資源,如果數據量小,那麼全部數據都放在記憶體上自然是最優選擇,這時候couchbase的效率也是異常高,但是數據量大的時候過多的數據就會被放在硬碟之中。當然,最終所有數據都會寫入硬碟,不過有些頻繁使用的數據提前放在記憶體中自然會提高效率。couchbase後臺有個進程,專門把一定時間沒有被訪問的數據移出記憶體,這個進程的掃描時間和數據的最大無活動時間都是可以設置的。這裡有個低水位的概念,也就是說當移除數據過多以至於記憶體中有效數據占用記憶體低於低水位的時候,couchbase會隨機挑一些文件到記憶體中以達到低水位。對於所有文件couchbase都會建立一個額外的56byte的metadata,這個metadata功能之一就是表明數據狀態,是否活動在記憶體中。同時文件的key也作為標識符和metadata一起長期活動在記憶體中。couchbase官方建議bucket申請的記憶體中,metadata和key所占用的記憶體不應超過一半,否則couchbase的性能會顯著下降。而這個建議我也測試過,準確無誤。因此一定記憶體所能支持的數據條數其實也就一定了,具體算一下就能估摸個大概。為了保證這個條件,顯然當有效數據占用超過一定記憶體時就需要把超額數據移除了,這裡有個概念,高水位。當有效數據記憶體占用超過高水位時,couchbase就會移除數據。高低水位都是可以設置的。

對於配置節點記憶體的問題,官方給了一個詳細的計算公式,如下:
變數:
documents_num 工作集中文件總數
ID_size 文件key的平均大小
value_size 文件內容平均大小
number_of_replicas 為文件做的備份數
working_set_percentage 工作集中放置於記憶體中的比率
per_node_ram_quota 每個節點給bucket申請的記憶體大小
metadata_per_document 56Byte
headroom 固態硬碟:25% ,傳統硬碟: 30%
high_water_mark 預設值為85%
公式:
no_of_copies 1 + number_of_replicas
total_metadata (documents_num) * (metadata_per_document + ID_size) * (no_of_copies)
total_dataset (documents_num) * (value_size) * (no_of_copies)
working_set total_dataset * (working_set_percentage)
Cluster RAM quota required (total_metadata + working_set) * (1 + headroom) / (high_water_mark)
number of nodes Cluster RAM quota required / per_node_ram_quota


Couchbase相比其他資料庫操作起來要更為麻煩一些,尤其是操作數據上,可以說couchbase server本身為了追求效率直接就把一些工作放棄了,為此在其他資料庫上簡單的數據操作到這裡必須要好好規劃一番才行。這一次主要是簡單介紹一下在Couchbase中如何進行條件查詢,而理解了條件查詢自然也就能明白相應的數據刪改是如何操作。

首先要清楚地認識到,couchbase本身存儲的數據之間是毫無關係的,如果不提前做好準備就無法進行任何條件查詢,而條件查詢的必要前提就是建立了正確的View。在couchbase中,一個bucket下包含多個design document,而每一個document中又包含多個View,這個結構的意義會在後面說,總之先有個概念。
View的寫法還是結合manul中的實例比較方便,http://docs.couchbase.com/couchbase-manual-2.2/#writing-views,寫法並不複雜,但是需要註意key的作用。這裡的key就是可供我們條件查詢的索引,所以根據條件查詢的檢索條件不同會需要不同的key,也就需要準備不同的View,這就是View為什麼會有多個的原因,因為每一個View只能針對單一類型檢索條件。當bucket中出現一個新的View時,就會遍歷bucket中的數據,並把最終結果集保存在硬碟上,這個結果集就是Index,也是條件查詢時直接查詢的數據列表。當數據有所變動時,view不會立刻隨之更新,而是受一個定時運行的後臺進程管理使之更新,這個周期預設是5000ms(可以自行設置)。除了依靠自動更新外,也可以依賴客戶端請求觸發更新。客戶端進行查詢時有三種模式,第一種是直接獲取當前存儲的Index,第二種是先更新Index然後獲取最新的,第三種是獲取當前存儲的Index併在獲得結果後更新Index。顯然根據查詢壓力和Index對同步要求的不同,這個模式要酌情選擇。當View有所改變之時,所述Document下所有的View都會重新遍歷所有數據來生成新的index,這會造成相當大的I/O壓力,這也是為什麼要有多個design document。


關於建立View的概念說的差不多了,剩下的細節就看manul補充即可,下麵說一下有了View又應該如何查詢。沒有了傳統的SQL語句,我們的查詢方式自然也大不一樣。這裡的查詢取決於View。在View中利用函數我們返回了一組key-value值,而我們查詢的就是生成的key值,最後返回的則是id-key-value的組合。查詢的語法與細節看這個http://docs.couchbase.com/couchbase-manual-2.2/#querying-views,有前端經驗的學習起來一定很順手,因為語法是按照REST來的,只要看一下有哪些參數怎麼用就可以了。
最後特別提一點,那就是如何修改數據。在當前版本下,修改數據的方式暫時只有一種:先查詢到數據,把這個數據取出,在客戶端修改需要修改的部分,再用強制寫入的模式把數據存回去,這就是一個完整的修改周期,異常麻煩。

最後就是取出的數據如何方便地抽離。因為取回的是json格式文檔,也就是一個長字元串,需要取出相應條目的內容就需要專門的處理。我是用C SDK的,所以我可以藉助一個第三方的庫,也就是libyajl,這個庫可以用來分割就json中的各條目以方便我們使用。yajl可以直接在ubuntu下用apt-get安裝,也可以手動安裝https://github.com/lloyd/yajl。如果用其他SDK要如何處理我就不清楚了,其他語言的SDK我沒研究過,python這類腳本語言本身就有各種庫大概直接就能處理了。不過我建議儘量用腳本語言,這樣改起來也方便,SDK提供的介面也要更細緻更方便,我是只會C才只能用C SDK的,真是麻煩。

總之這裡只是講一下基本概念,具體操作的實施方法需要查閱官方手冊,無論是建立View還是查詢Index都是有嚴格語法的,照著manul的教程走就沒錯了。如果熟悉REST方法的話,查詢甚至可以直接用curl或wget加上合適的指令完成,其他工作也可以這樣完成,參考http://docs.couchbase.com/couchbase-manual-2.2/#using-the-rest-api和http://docs.couchbase.com/couchbase-manual-2.2/#design-document-rest-api。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 監聽EditText的文本變化需要給EditText控制項加一個addTextChangeListener監聽器 editText.addTextChangeListener(textWatcher); 這裡的textWatcher是一個TextWatcher對象, TextWatcher是一個介面, ...
  • 項目:蒙文詞語檢索 日期:2016-05-01 提示:The constructor User.Student(String, String, String) is not visible 出處:Dbdao.insert(new Student("Achilles", "Male", "14")); ...
  • 小喵的嘮叨話:最近京東圖書大減價,小喵手癢了就買了本《Redis設計與實現》[1]來看看。這裡權當小喵看書的筆記啦。這一系列的模式,主要是先介紹Redis的實現原理(可能很大一部分會直接照搬原作者的描述),加上小喵自己的想法,之後配合Redis官網上的各種相關的操作命令(原書上貌似沒有很多的介紹命令 ...
  • 某次,在使用PLSQ鏈接資料庫的時候,出現了錯誤如下: 然後點擊視窗上面的 工具 –> 首選項 –> Oracle –> 連接 ,然後看到這樣的視窗: 用電腦根據上面的地址搜索不到 \instantclient_11_2 說明電腦上面沒有 instantclient_11_2 插件,然後決定重新下載 ...
  • <!--?xml:namespace prefix = "v" ns = "urn:schemas-microsoft-com:vml" /--> Oracle中的觸發器是一個非常有用的技術,它與存儲過程和函數不同的是,存儲過程與函數需要用戶顯示調用才執行,而觸發器是由一個事件來啟動運行。即觸發器是 ...
  • SQL Server 與 Oracle 資料庫兩者一個最大的區別,就是其應用平臺的差異。 現在SQL Server資料庫只能夠部署在微軟的操作系統上。而Oracle資料庫其不但可以支持微軟的操作系統,而且還可以支持開源的操作系統,如Linux等等。 感覺最大區別是在鎖機制上,一個是頁級鎖,一個是行級 ...
  • NoSQL是非關係型資料庫,即not only sql,key/value鍵值對存儲。 現有Nosql DB產品:Redis/MongoDB/Memcached等等。 SQL Sever是關係型資料庫,由各種關係的列組成表。保障數據的完整性。 為什麼需要NoSQL? 對資料庫高併發讀寫的需求 對海量 ...
  • IO就是對磁碟的讀/寫。 一次IO,就是發出指令+執行命令。 磁碟IO的時間=尋道時間+數據傳輸時間 單盤不能併發IO。 radis多個盤併發IO。 影響IO的最大因素是尋道時間。 影響電腦速度:cpu、記憶體、IO. 提高電腦IO的方法:將機械硬碟換為液態硬碟。 cpu:可以將電腦轉速想象成一個人的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...