.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介绍的文章:
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.c
.Net分布式缓存应用实例:Couchbase的更多相关文章
- C#分布式缓存二:Asp.Net中使用Couchbase
前言 上一篇<C#分布式缓存一:Couchbase的安装与简单使用>主要讲解对Couchbase服务端的安装配置和客户端的引用调用,通过代码来完成最简单的实现调用.本次通过简单的配置,来完 ...
- C#分布式缓存Couchbase
C#分布式缓存Couchbase使用 一.简介 目前C#业界使用得最多的 Cache 系统主要是 Memcached和 Redis. 这两个 Cache 系统可以说是比较成熟的解决方案,也是很多系统当 ...
- ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...
- 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇
Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...
- CYQ.Data V5 分布式缓存MemCached应用开发介绍
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
- 基于redis分布式缓存实现(新浪微博案例)
第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...
- 企业项目开发--分布式缓存Redis
第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...
- EhCache RMI 分布式缓存/缓存集群
EhCache 系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点. EhCache 的主要特性有: 快速.精干 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘, ...
- [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现
一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性.但是上一专题消息队列是基于内存中队列对象来实现,这样实现有一 ...
随机推荐
- dedecms织梦
dedecms的安装,其修改连接数据库文件是:common.inc.php
- 四、CCSprite
在介绍CCSprite之前,先要理解游戏开发中的一个核心概念:精灵.精灵也称为游戏对象,它可以用来表示游戏中的任何物体,比如敌人.子弹.甚至是一个背景图片.一段文字.CCSprite可以说是在coco ...
- JavaScript数据结构——链表
链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的.每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 好处:可以添加或移除任意项,它会按需扩容 ...
- 【题解】【排列组合】【回溯】【Leetcode】Gray Code
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- 服务调用方案(Spring Http Invoker) - 我们到底能走多远系列(40)
我们到底能走多远系列(40) 扯淡: 判断是否加可以效力于这家公司,一个很好的判断是,接触下这公司工作几年的员工,了解下生活工作状态,这就是你几年后的状态,如果满意就可以考虑加入了. 主题: 场景: ...
- tyvj 1056 能量项链 区间dp (很神)
P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述 在Mars星球上,每个Mars人都随身佩 ...
- Win 環境構建調試用TreeWalker
語法 var ppTreeWalker = document.createTreeWalker(pRootNode, ulWhatToShow, pFilter, fEntityReferenceEx ...
- Matlab神经网络工具箱学习之一
1.神经网络设计的流程 2.神经网络设计四个层次 3.神经网络模型 4.神经网络结构 5.创建神经网络对象 6.配置神经网络的输入输出 7.理解神经网络工具箱的数据结构 8.神经网络训练 1.神经网络 ...
- H5标签-canvas实现颜色拾取功能
HTML5 <canvas> 标签是用于绘制图像,不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器),必须使用脚本(通常是 JS)来完成实际的绘图任务. &l ...
- js&jquery验证邮箱和手机号是否正确范例
实现源码: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...