.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/
本文版权归作者所有,欢迎转载,但必需注明出处,并且在转载页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-08-09 14:47:50

.Net分布式缓存应用实例:Couchbase的相关文章

C#分布式缓存二:Asp.Net中使用Couchbase

前言 上一篇<C#分布式缓存一:Couchbase的安装与简单使用>主要讲解对Couchbase服务端的安装配置和客户端的引用调用,通过代码来完成最简单的实现调用.本次通过简单的配置,来完成一个简单的Asp.Net客户端调用. 项目添加和配置文件 第一步:首先配置文件配置,打开Web.config文件,在configuration中添加以下内容: <configSections> <section name="couchbase" type="C

C#分布式缓存Couchbase

C#分布式缓存Couchbase使用 一.简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当然的选择. Memcache的开发团队开发了Membase,支持多台服务器集群,数据的切片和复制,有效的提高了服务稳定性和数据的安全性,并且支持数据的持久存储.但代码的稳定性不够好.之后,Membase团队与CouchDB团队合并,推出二合一的产品: Couchbase. Couchbase的最大特

第八章 企业项目开发--分布式缓存memcached

注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存越来越小,最后系统会被拖慢(这一点与第二点联系起来) 本地缓存存于本机,其缓存数量与大小受本机内存大小限制 本地缓存存于本机,其他机器的访问不到这样的缓存 解决方案:分布式缓存 Jboss cache:缓存还存于本机,但是会同步更新到其他机器(解决了第三个问题,解决不了第一和第二个问题),如果缓存机器数量很多

分布式缓存学习总结

一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 三.Memcached基础原理 四.Memcache下载与安装 五.MencacheHelper.cs 示例使用 结合Session与项目配置缓存 六.Redis和Memcache的区别总结 一.分布式缓存简图 二.为什么使用Memcached分布式缓存呢? 首先先讲讲为何要缓存,在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已

阿里云分布式缓存OCS与DB之间的数据一致性

[分布式系统的数据一致性问题]   OCS概要介绍 据AlertSite网络分析公司表示,Facebook的响应时间在2010年平均为1秒钟,到2011年中期已提高到了0.73秒.对比来看,响应时间占第二位的LinkedIn,网络下载内容时要花费将近2倍的时间.Twitter的响应时间则整整迟了2秒钟.响应时间优化的首要手段就是采用缓存技术,减少系统间交互请求和磁盘IO. OCS是阿里巴巴集团的分布式缓存产品,支撑着淘宝.阿里巴巴.支付宝的日常运作,尤其在双11等大型活动上,承载了绝大多数的数据

基于redis分布式缓存实现

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

EhCache 分布式缓存/缓存集群

开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发依赖库: JDK6. JavaEE5.ehcache-core-2.5.2.jar Email:[email protected] Blog:http://blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ http://hoojo.blogjava.

基于redis分布式缓存实现(新浪微博案例)

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

EhCache RMI 分布式缓存/缓存集群

EhCache 系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点. EhCache 的主要特性有: 快速.精干 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具有缓存和缓存管理器的侦听接口: 支持多缓存管理器实例,以及一个实例的多个缓存区域: 提供 Hibernate 的缓存实现: EhCache集群解决的问题:  由 于 EhCa