.Net分布式缓存应用实例:Couchbasehtml
吴剑 2015-11-20git
原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jiangithub
吴剑 http://www.cnblogs.com/wu-jianweb
Couchbase概述sql
Couchbase最先叫Membase,是由Memcached项目组的一些头目另立的山头。mongodb
2011年与CouchDB合并,正式命名为Couchbase。数据库
2013年,做为NoSQL技术初创企业,拿到了2500万美圆的D轮投资。json
截稿时止,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