.Net分布式緩存應用實例:Couchbase


.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介紹的文章:

Couchbase介紹,更好的Cache系統

NoSQL showdown: MongoDB vs. Couchbase

吳劍 http://www.cnblogs.com/wu-jian

一些主要的官網入口:

官網主頁:http://www.couchbase.com 

說明文檔: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/
本文版權歸作者所有,歡迎轉載,但必需注明出處,並且在轉載頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
支付寶打賞


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM