• .Net分布式缓存应用实例:Couchbase


    转自: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.c

  • 相关阅读:
    手机版页面跳转
    设计模式转载(史上最全设计模式导学目录|完整版)
    linux 常用命令
    数据结构与算法JavaScript描述.
    常用算法js版(冒泡排序 ,选择排序 ,插入排序 ,希尔排序 ,归并排序 ,快速排序 ,堆排序 ,计数排序 ,桶排序 ,基数排序)
    伪元素和伪类
    双向数据绑定
    2016年黑马程序员已出品各学科最新学习路线图:
    jQuery插件开发全解析
    蛋白质、碳水化合物和脂肪
  • 原文地址:https://www.cnblogs.com/sunjie9606/p/5162943.html
Copyright © 2020-2023  润新知