前言

  上一篇《C#分布式缓存一:Couchbase的安装与简单使用》主要讲解对Couchbase服务端的安装配置和客户端的引用调用,通过代码来完成最简单的实现调用。本次通过简单的配置,来完成一个简单的Asp.Net客户端调用,基于dotNetFramework4.0,Couchbase客户端版本只能用CouchbaseNetClient.1.3.12及以下。

项目添加和配置文件

  第一步:首先配置文件配置,打开Web.config文件,在configuration中添加以下内容:  

<configSections>
<section name="couchbase" type="Couchbase.Configuration.CouchbaseClientSection, Couchbase"/>
</configSections>
<couchbase>
<servers bucket="default" bucketPassword="">
<add uri="http://127.0.0.1:8091/pools"/>
</servers>
</couchbase>

  说明:Servers节点下只添加了一个URI,而且是我的本机。这个地方通常会配置多个URI列表,是客户端获取集群的配置信息。默认Couchbase 服务端安装是一个名为default、没有密码的存储区(bucket),所以这里存储区密码(bucketpassword)的属性为可选。如果你创建了一个已认证的存储区,必须在bucketPassword中配置那个值。这里暂时就先使用默认的。

  第二步:添加一个类库。命名为CacheLibrary,添加Couchbase客户端DLL引用。项目结构如下图:

  

CouchbaseClient的CRUD操作

  在实际开发中,创建客户端的实例是昂贵的。 这里就创建一个单一的客户端实例,也就是单列。

  第一步:缓存接口  

    /// <summary>
/// 缓存接口
/// </summary>
interface ICacheManager
{
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <returns></returns>
bool AddCache(string key, object obj); /// <summary>
/// 添加缓存带过期时间
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="minutes"></param>
/// <returns></returns>
bool AddCache(string key, object obj, int minutes);
/// <summary>
/// 获取缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
T GetCache<T>(string key) where T : class; /// <summary>
/// 清除指定Key的缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
bool ClearCache(string key); /// <summary>
/// 清除所有的缓存
/// </summary>
void FlushAll(); }

第二步:缓存的实现及单例  

      /// <summary>
/// 单例模式缓存的实现
/// </summary>
public class CouchbaseCacheFactory:ICacheManager
{
//创建一个静态的只读对象(用于下面的加锁)
private static readonly object SyncRoot = new object(); #region 缓存工厂的基础属性字段,静态构造方法
private static readonly CouchbaseClient _instance; //静态构造函数,在类初始化的时候执行,不用加 public / private 没有意义,因为这个是由.net自动来调用
static CouchbaseCacheFactory()
{
_instance = new CouchbaseClient();
}
private static CouchbaseClient Instance
{
get { return _instance; }
} #endregion #region 工厂单例
private static CouchbaseCacheFactory _shareInstance; public static CouchbaseCacheFactory GetCurrentCache()
{
if (_shareInstance == null)
lock (SyncRoot)
{
_shareInstance = new CouchbaseCacheFactory();
}
return _shareInstance;
}
#endregion #region CRUD 接口的实现 /// <summary>
/// 添加缓存(序列化保存)
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <returns></returns>
public bool AddCache(string key, object obj)
{
//注意:如果直接使用object来保存,则Couchbase缓存会帮我们自动加密(Base64)
//如果先序列化后,再保存,那么就不会加密
string strJson = JsonConvert.SerializeObject(obj);
return Instance.Store(StoreMode.Set, key, strJson);
} /// <summary>
/// 添加缓存并设置时间(序列化保存)
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="minutes"></param>
/// <returns></returns>
public bool AddCache(string key, object obj, int minutes)
{
string strJson = JsonConvert.SerializeObject(obj);
return Instance.Store(StoreMode.Set, key, strJson, DateTime.Now.AddMinutes(minutes));
} /// <summary>
/// 通过Key清除缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool ClearCache(string key)
{
return Instance.Remove(key);
} /// <summary>
/// 设置缓存过期(失效后通过Get取不出来)
/// </summary>
public void FlushAll()
{
Instance.FlushAll();
} /// <summary>
/// 获取缓存(返回反序列化后的结果)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetCache<T>(string key) where T : class
{
string strJson = Instance.Get<string>(key);
if (string.IsNullOrEmpty(strJson))
{
return null;
}
else
{
return (T)JsonConvert.DeserializeObject(strJson,typeof(T));
}
}
#endregion
}

 说明:

    StoreMode.Add ,StoreMode.Replace 和 StoreMode.Set 的区别

    Add ,表示添加一个新的key

    Replace ,表示更新一个已经存在的key

    set ,表示如果key不存在则添加、存在则更新。

    如果key已经存在那么Add就会失败,如果key不存在Replace操作会失败。所以建议还是用 Set吧!    

    添加方法返回值是一个bool类型,表示操作是否成功。

    删除操作比较简单,Remove返回一个bool类型的返回值,表示操作是否成功。

第三步:页面上简单调用

  新建一个页面:Index.aspx,再添加几个控件  

       Key:<asp:TextBox ID="txtKey" runat="server"></asp:TextBox>
Value:<asp:TextBox ID="txtValue" runat="server"></asp:TextBox><br />
<asp:Button ID="btnAdd" runat="server" Text="添加" OnClick="btnAdd_Click" />&nbsp;<asp:Button ID="btnGet" runat="server" Text="获取" OnClick="btnGet_Click" />&nbsp;
<asp:Button ID="btnDel" runat="server" Text="删除" OnClick="btnDel_Click" /><br />
信息:<asp:Label ID="lblInfo" runat="server" Text="Label"></asp:Label>

  效果如下:

   

测试结果

  1.添加:CouchbaseCacheFactory.GetCurrentCache().AddCache(strKey, strValue)

  后台管理也可以看到:

  2获取. strValue = CouchbaseCacheFactory.GetCurrentCache().GetCache<string>(strKey);

  3.删除:CouchbaseCacheFactory.GetCurrentCache().ClearCache(strKey);

  刷新后台,看不到值了:

Couchbase Json扩展方法

  如果想简单的读写JSON, 在Couchbase.Extensions命名空间下CouchbaseClientExtensions类提供了两个方法, StoreJson 和 GetJson。这两个方法都是依赖于开源类库: Newtonsoft.Json。这两个只是简单的对get和store方法的重写。

  新建一个实体类:Person,用JsonProperty标签。

public class Person
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("fullName")]
public string FullName { get; set; }
}

  上面的接口实现类中已经用Newtonsoft.Json序列化存储了。看下效果:

  下面使用get和store方法实现,代码:  

       //配置服务器
CouchbaseClientConfiguration cbcc = new CouchbaseClientConfiguration();
//设置各种超时时间
cbcc.SocketPool.ReceiveTimeout = new TimeSpan(, , );
cbcc.SocketPool.ConnectionTimeout = new TimeSpan(, , );
cbcc.SocketPool.DeadTimeout = new TimeSpan(, , );
//使用默认的数据库
cbcc.Urls.Add(new Uri("http://127.0.0.1:8091/pools/default")); //建立一个Client,装入Client的配置
CouchbaseClient client = new CouchbaseClient(cbcc);
Person per = new Person() { Id = "", FullName = ".Net" };
//存储
client.StoreJson(StoreMode.Set, "p2", per);
//取
var json = client.GetJson<Person>("p2");

启用Flush

  安装的时候在配置bucket类型时,注意最下面的 Flush,选中后,可以支持 Flush, 否则不支持,在 .NET 客户端进行 Flush,会得到一个异常。一旦安装完成,在管理界面上,没有重新配置 Flush 的选项,如果在安装的时候没有启用 Flush ,在安装结束之后希望启用,怎么办呢?

  可以使用 couchbae-cli 命令行。这个命令位于 Couchbase 安装目录中的 \Couchbase\Server\bin 文件夹中。

  对于启用 Flush 来说,是修改 bucket 的配置参数,需要使用 bucket-edit 命令,使用 --bucket 指定修改配置的 bucket,--enable-flush=1 表示启用,=0 显示就是禁用了。剩下的参数是管理员的帐号和口令:

couchbase-cli bucket-edit --bucket=default --enable-flush= -c 127.0.0.1  -u Administrator -p 

  如果成功的话,服务器会返回一个说明:SUCCESS: bucket-edit。然后重启Couchbase服务即可。

  

总结

  这一篇主要是学习如何在项目中的简单使用,现在做的项目中,应用.Net的缓存作处理。如果有机会一定要在项目中用Couchbase进行实践,那样才会更深入。

代码百度网盘,VS2015打开。同时希望各位大神指导下,呵呵。

  

C#分布式缓存二:Asp.Net中使用Couchbase的更多相关文章

  1. Asp.Net中使用Couchbase——Memcached缓存使用篇

    Asp.Net中使用Couchbase——Memcached缓存使用篇 前言 在上一篇Asp.Net中使用Couchbase——Memcached缓存入门篇http://www.cnblogs.com ...

  2. 用分布式缓存提升ASP.NET Core性能

    得益于纯净.轻量化并且跨平台支持的特性,ASP.NET Core作为热门Web应用开发框架,其高性能传输和负载均衡的支持已广受青睐.实际上,10-20台Web服务器还是轻松驾驭的.有了多服务器负载的支 ...

  3. C# Azure 存储-分布式缓存Redis在session中的配置

    1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知 ...

  4. (二)ASP.NET中JavaScript的中英文(多语言)实现方案(二)

    在ASP.NET中JavaScript的中英文(多语言)实现方案中简单的介绍了js实现多语言的一种方案.下面将要讲述另外一种方法,尽管很相似,但是有些地方也是需要细细琢磨的,不说了,先看看. 在Lan ...

  5. Asp.Net中使用Couchbase——Memcached缓存入门篇

    本文个人同步博客地址: http://aehyok.com/Blog/Detail/96.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文 ...

  6. .NET Core应用中使用分布式缓存及内存缓存

    .NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...

  7. Redis中的Java分布式缓存

    为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...

  8. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  9. ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存

    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完 ...

随机推荐

  1. AIX系统程序异常不释放光驱处理

    AIX操作系统有时会出现程序异常不释放光驱,可以用以下命令进行处理: #fuser -kxuc /dev/cd0 或者 #fuser /dev/cd0 以上命令会列出访问光驱设备的所有进程,然后使用k ...

  2. Dictionary和IDictionary

    Dictionary<string> s = new Dictionary<string>(); 这个是s是Dictionary类型.是个类 类型,实现了接口,提供了更多的方法 ...

  3. Log4j 配置 的webAppRootKey参数问题

    为了让Web项目中的Spring 使用Log4j做如下配置: 1.在web.xml中添加如下内容: <!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的&q ...

  4. LoadRunner ---思考时间设置

    用户访问某个网站或软件,一般不会不停地做个各种操作,例如一次查询,用户需要时间查看查询的结果是否是自己想要的.例如一次订单提交,用户需要时间核对自己填写的信息是否正确等. 也就是说用户在做某些操作时, ...

  5. 循序渐进Python3(七) -- 2-- 面向对象进阶

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  6. 构建ASP.NET网站十大必备工具(1)

    最近使用ASP.NET为公司构建了一个简单的公共网站(该网站的地址:http://superexpert.com/).在这个过程中,我们使用了数量很多的免费工具,如果把构建ASP.NET网站的必备工具 ...

  7. Bash Shell实用快捷键

    Ctrl-D 相当于Del键,即删除光标所在处的字符 Ctrl-E 相当于End键,即将光标移动到本行末尾 Ctrl-K 用于删除从光标处开始到结尾处的所有字符 Ctrl-L 清屏,相当于clear命 ...

  8. cocos2d-x 坐标系

    OPenGL坐标系:原点为屏幕左下角 屏幕坐标系:原点在屏幕左上角

  9. java.io.Serializable 序列化问题

    java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...

  10. iOS开发之AFNetworking 3.0.4使用-OC

      GET请求 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:URL parameters: ...