.Net分散式快取應用例項:Couchbase
吳劍 2015-11-20
原創文章,轉載必需註明出處:http://www.cnblogs.com/wu-jian
吳劍 http://www.cnblogs.com/wu-jian
Couchbase概述
Couchbase最早叫Membase,是由Memcached專案組的一些頭目另立的山頭。
2011年與CouchDB合併,正式命名為Couchbase。
2013年,作為NoSQL技術初創企業,拿到了2500萬美元的D輪投資。
截稿時止,Couchbase最新的版本是4.1.0 Developer Preview。
吳劍 http://www.cnblogs.com/wu-jian
Couchbase是開源的,分散式NoSQL文件型(或Key/Value型)記憶體資料庫,文件結構基於大家都很熟悉的JSON。此外它內建了一個便捷的WEB管理後臺,提供企業版,社群版和原始碼的下載。如下是一些關於Couchbase介紹的文章:
NoSQL showdown: MongoDB vs. Couchbase
吳劍 http://www.cnblogs.com/wu-jian
一些主要的官網入口:
說明文件:http://developer.couchbase.com/guides-and-references
下載地址:http://www.couchbase.com/nosql-databases/downloads
吳劍 http://www.cnblogs.com/wu-jian
在安裝使用Couchbase前, 需要理解一些基礎名詞:
Node:節點,即一臺安裝了Couchbase的伺服器,所有節點擁有相同的元件和服務,並提供相同的介面。
Cluster:叢集,多個節點組成一個叢集。
Bucket:Bucket類似於資料庫的概念,在Couchbase中我們可為不同邏輯的專案建立不同的Bucket。
Item:一個項即一個Key/Value鍵值對。
吳劍 http://www.cnblogs.com/wu-jian
Couchbase服務端安裝
從官網下載服務端安裝包,然後按提示很簡單完成安裝過程.
安裝完成後會自動在瀏覽器中開啟一個頁面,點選“Setup”進行Couchbase服務端配置,官方的配置手冊可 參考這裡
吳劍 http://www.cnblogs.com/wu-jian
①設定節點的資料持久化儲存位置,建議將資料與索引使用不同位置
②設定節點的IP或主機名
③設定節點開啟的服務,以及記憶體分配
吳劍 http://www.cnblogs.com/wu-jian
可選擇安裝Sample以方便學習,需要注意的是在Couchbase中,每個專案都是一個“Bucket”。如果不需要Sample,直接下一步就好。
吳劍 http://www.cnblogs.com/wu-jian
①設定Bucket的型別,大多數情況下使用Couchbase即可
②為Bucket分配記憶體以及設定Cache Metadata,Cache Metadata的工作原理可 參考這裡
③設定映象數量
④設定Bucket的I/O優先順序,只有當Couchbase中存在多個Bucket時該值才具有實際意義
⑤是否允許Flush,不建議在生產環境中開啟
關於Bucket設定更詳細的說明可 參考這裡
吳劍 http://www.cnblogs.com/wu-jian
是否接收Couchbase版本更新通知,以及填寫註冊資訊。
吳劍 http://www.cnblogs.com/wu-jian
最後一步,設定管理員帳號與密碼。
Couchbase的安裝配置過程非常簡單,安裝成功後,會有一個“CouchbaseServer”的系統服務,當我們需要啟用或停用Couchbase時,通過對這個服務操作即可。
吳劍 http://www.cnblogs.com/wu-jian
Couchbase客戶端配置(.Net)
在官網下載 .Net Client Library,然後在專案中新增引用:
吳劍 http://www.cnblogs.com/wu-jian
app.config / web.config 配置示例:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--Couchbase客戶端配置節點定義--> <configSections> <sectionGroup name="couchbaseClients"> <section name="couchbase" type="Couchbase.Configuration.Client.Providers.CouchbaseClientSection, Couchbase.NetClient" /> </sectionGroup> </configSections> <!--Couchbase客戶端配置,參考:http://developer.couchbase.com/documentation/server/4.1-dp/sdks/dotnet-2.2/configuring-the-client.html--> <couchbaseClients> <couchbase useSsl="false" operationLifespan="1000"> <servers> <add uri="http://127.0.0.1:8091/pools"></add> </servers> <buckets> <add name="default" useSsl="false" password="" operationLifespan="2000"> <connectionPool name="defaultPool" maxSize="10" minSize="5" sendTimeout="12000"></connectionPool> </add> </buckets> </couchbase> </couchbaseClients> <!--約束Newtonsoft.Json版本--> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
因為 Couchbase .net client library 使用了 Newtonsoft.json 6,有時我們的專案中使用了 Newtonsoft.json 的其它版本,比如我的專案中使用的就是7,所以需要在配置檔案中新增一個 runtime 節點統一約束使用一個統一的版本,避免程式執行出錯。
吳劍 http://www.cnblogs.com/wu-jian
Couchbase客戶端程式碼示例
在安裝完成服務端和編寫客戶端程式碼之前,其實還有一個很重要的環節:Couchbase服務端的管理,開啟瀏覽器輸入 http://localhost:8091 即可進入管理介面,包括 Cluster、Node、Bucket、Item的管理,都是通過這個內建的WEB後臺進行的。管理後臺功能強大內容繁多,具體細節可 參考這裡。
吳劍 http://www.cnblogs.com/wu-jian
Couchbase的API非常靈活,包括客戶端的配置,與服務端的聯接,基礎的增刪讀寫操作,可以在程式碼中精確控制每個細節。當然它也提供了一些封裝的Helper方便簡單呼叫。
官方提供了一個完整的.Net客戶端DEMO,可 點選這裡 下載。如果你需要深入研究 .Net Client SDK 可 點選這裡 下載它的原始碼。
吳劍 http://www.cnblogs.com/wu-jian
如下程式碼我封裝了一個Couchbase的增、刪、讀、寫示例:
using System; using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Couchbase; using Couchbase.Core; using Couchbase.Configuration.Client; namespace ZhengHe.Cache.Couchbase { /// <summary> /// Couchbase工具 /// </summary> public static class Helper { /// <summary> /// 初始化 ClusterHelper /// 參考:http://developer.couchbase.com/documentation/server/4.1-dp/sdks/dotnet-2.2/cluster-helper.html /// </summary> static Helper() { //使用配置節點進行初始化 ClusterHelper.Initialize("couchbaseClients/couchbase"); } /// <summary> /// 在Bucket中獲取一個文件 /// </summary> /// <typeparam name="T">動態資料型別</typeparam> /// <param name="key">文件唯一標識</param> /// <param name="bucketName">指定Bucket名稱</param> /// <returns></returns> public static T DocumentGet<T>(string key, string bucketName = "default") { var bucket = ClusterHelper.GetBucket(bucketName); var result = bucket.GetDocument<T>(key); if (result.Success) { return result.Content; } return default(T); } /// <summary> /// 在Bucket中新增/更新一個文件 /// </summary> /// <typeparam name="T">動態資料型別, The actual document value to store. This can be a scalar value, an object, or a dynamic type.</typeparam> /// <param name="key">文件唯一標識</param> /// <param name="content">動態資料</param> /// <param name="expiry">過期時間(秒),如果小於或等於0表示持久存在</param> /// <param name="bucketName">指定Bucket名稱</param> /// <returns></returns> public static bool DocumentUpsert<T>(string key, T content, int expiry = 0, string bucketName = "default") { if (expiry < 0) expiry = 0; var bucket = ClusterHelper.GetBucket(bucketName); var result = bucket.Upsert( new Document<T> { Id = key, Content = content, Expiry = (uint)(expiry * 1000) //將秒轉換為毫秒 }); if (result.Success) return true; return false; } /// <summary> /// 在Bucket中刪除一個文件 /// </summary> /// <param name="key">文件唯一標識</param> /// <param name="bucketName">指定Bucket名稱</param> /// <returns></returns> public static bool DocumentRemove(string key, string bucketName = "default") { var bucket = ClusterHelper.GetBucket(bucketName); var result = bucket.Remove(key); if (result.Success) return true; return false; } }//end class }
吳劍 http://www.cnblogs.com/wu-jian
結束語
關於快取服務,在Memcached之前,自己嘗試過封裝.Net Cache,研究過MySQL Memory儲存引擎。因各種原因,Memcached被擱置了好久,直到最近幾天,把Couchbase的文件通讀了一遍,完成了簡單的DEMO,不得不說,Couchbase作為一款成熟的商業運營的開源軟體,確實做的非常不錯,文件和DEMO非常細緻,開發部署異常簡潔。
寫完DEMO後,還迫不及待的進行了一番測試,結果在我的大部分應用中,效率能提升70%左右(當然,這些應用之前沒有部署Memcache技術),後面幾天我會盡快將Couchbase部署至生產環境。目前花的時間不多,對Couchbase的研究也僅限於初步瞭解,後續會繼續將心得體會和一些細節在此分享,不足之處也請大家指正。
吳劍 http://www.cnblogs.com/wu-jian
<全文完>
吳劍 http://www.cnblogs.com/wu-jian
作者:吳劍
出處:http://www.cnblogs.com/wu-jian/
本文版權歸作者所有,歡迎轉載,但必需註明出處,並且在轉載頁面明顯位置給出原文連線,否則保留追究法律責任的權利。