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

前言

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

项目添加和配置文件

  第一步:首先配置文件配置,打开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操作

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

  第一步:缓存接口  

 1    /// <summary>
 2     /// 缓存接口
 3     /// </summary>
 4     interface ICacheManager
 5     {
 6         /// <summary>
 7         /// 添加缓存
 8         /// </summary>
 9         /// <param name="key"></param>
10         /// <param name="obj"></param>
11         /// <returns></returns>
12         bool AddCache(string key, object obj);
13
14         /// <summary>
15         /// 添加缓存带过期时间
16         /// </summary>
17         /// <param name="key"></param>
18         /// <param name="obj"></param>
19         /// <param name="minutes"></param>
20         /// <returns></returns>
21         bool AddCache(string key, object obj, int minutes);
22         /// <summary>
23         /// 获取缓存
24         /// </summary>
25         /// <typeparam name="T"></typeparam>
26         /// <param name="key"></param>
27         /// <returns></returns>
28         T GetCache<T>(string key) where T : class;
29
30         /// <summary>
31         /// 清除指定Key的缓存
32         /// </summary>
33         /// <param name="key"></param>
34         /// <returns></returns>
35         bool ClearCache(string key);
36
37         /// <summary>
38         /// 清除所有的缓存
39         /// </summary>
40         void FlushAll();
41
42     }

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

  1      /// <summary>
  2     /// 单例模式缓存的实现
  3     /// </summary>
  4     public class CouchbaseCacheFactory:ICacheManager
  5     {
  6         //创建一个静态的只读对象(用于下面的加锁)
  7         private static readonly object SyncRoot = new object();
  8
  9         #region 缓存工厂的基础属性字段,静态构造方法
 10         private static readonly CouchbaseClient _instance;
 11
 12         //静态构造函数,在类初始化的时候执行,不用加 public / private 没有意义,因为这个是由.net自动来调用
 13         static CouchbaseCacheFactory()
 14         {
 15             _instance = new CouchbaseClient();
 16         }
 17         private static CouchbaseClient Instance
 18         {
 19             get { return _instance; }
 20         }
 21
 22         #endregion
 23
 24         #region 工厂单例
 25         private static CouchbaseCacheFactory _shareInstance;
 26
 27         public static CouchbaseCacheFactory GetCurrentCache()
 28         {
 29             if (_shareInstance == null)
 30                 lock (SyncRoot)
 31                 {
 32                     _shareInstance = new CouchbaseCacheFactory();
 33                 }
 34             return _shareInstance;
 35         }
 36         #endregion
 37
 38         #region CRUD 接口的实现
 39
 40         /// <summary>
 41         /// 添加缓存(序列化保存)
 42         /// </summary>
 43         /// <param name="key"></param>
 44         /// <param name="obj"></param>
 45         /// <returns></returns>
 46         public bool AddCache(string key, object obj)
 47         {
 48             //注意:如果直接使用object来保存,则Couchbase缓存会帮我们自动加密(Base64)
 49             //如果先序列化后,再保存,那么就不会加密
 50             string strJson = JsonConvert.SerializeObject(obj);
 51             return Instance.Store(StoreMode.Set, key, strJson);
 52         }
 53
 54         /// <summary>
 55         /// 添加缓存并设置时间(序列化保存)
 56         /// </summary>
 57         /// <param name="key"></param>
 58         /// <param name="obj"></param>
 59         /// <param name="minutes"></param>
 60         /// <returns></returns>
 61         public bool AddCache(string key, object obj, int minutes)
 62         {
 63             string strJson = JsonConvert.SerializeObject(obj);
 64             return Instance.Store(StoreMode.Set, key, strJson, DateTime.Now.AddMinutes(minutes));
 65         }
 66
 67         /// <summary>
 68         /// 通过Key清除缓存
 69         /// </summary>
 70         /// <param name="key"></param>
 71         /// <returns></returns>
 72         public bool ClearCache(string key)
 73         {
 74             return Instance.Remove(key);
 75         }
 76
 77         /// <summary>
 78         /// 设置缓存过期(失效后通过Get取不出来)
 79         /// </summary>
 80         public void FlushAll()
 81         {
 82             Instance.FlushAll();
 83         }
 84
 85         /// <summary>
 86         /// 获取缓存(返回反序列化后的结果)
 87         /// </summary>
 88         /// <typeparam name="T"></typeparam>
 89         /// <param name="key"></param>
 90         /// <returns></returns>
 91         public T GetCache<T>(string key) where T : class
 92         {
 93             string strJson = Instance.Get<string>(key);
 94             if (string.IsNullOrEmpty(strJson))
 95             {
 96                 return null;
 97             }
 98             else
 99             {
100                 return (T)JsonConvert.DeserializeObject(strJson,typeof(T));
101             }
102         }
103         #endregion
104     }

 说明:

    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(0, 0, 2);
            cbcc.SocketPool.ConnectionTimeout = new TimeSpan(0, 0, 4);
            cbcc.SocketPool.DeadTimeout = new TimeSpan(0, 0, 10);
            //使用默认的数据库
            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 = "102", FullName = ".Net" };
            //存储
            client.StoreJson(StoreMode.Set, "p2", per);
            //取
            var json = client.GetJson<Person>("p2");

遗留问题:FlushAll

  安装的时候因为服务桶没有配置,所以现在不能使用FlushAll,以后研究。

总结

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

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

  

时间: 2024-08-25 21:11:15

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

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

1. 开始 对于分布式的缓存,平常的session的处理是一个用户对应一台分布式的机器,如果这台机器中途挂机或者不能处理这个用户session的情况发生,则此用户的session会丢失,会发生不可预知的错误.如下图: 如果用Redis的分布式缓存,则能避免上面的情况.因为session是保存在Redis中,不会有丢失的情况,就算中途有服务器A挂掉.如下图: 2. 代码 1)在包管理器中,输入下面的包,安装 Install-Package Microsoft.Web.RedisSessionSta

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

.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对Redis和SQL Server的原生支持.除了这个独立的缓存系统之外,ASP.NET Core还借助一个中间件实现了“响应缓存”,它会按照HTTP缓存规范对整个响应实施缓存.ASP.NET Core 支持多种不同的缓存. 常见缓存响应的四种方式 1.内存缓存 顾名思义,缓存在内存中,生命周期默认伴

应用服务器性能优化之分布式缓存-分布式缓存架构

分布式缓存是指缓存部署在多个服务器组成的服务器集群中,以集群的方式提供缓存服务,其架构方式主要有两种,一种是以JBoss Cache为代表的需要同步更新的分布式缓存,一种是以Memchached为代表的互不通信的分布式缓存. 1.JBoss Cache Jboss Cache的分布式缓存在集群中的每一台服务器都缓存相同的数据,当集群中的某台服务器的缓存数据更新时,会通知集群中的其他服务器更新或者清除缓存.JBoss Cache通常将应用程序和缓存部署在同一台服务器上,应用程序可以从本地快速获取缓

快看,我们的分布式缓存就是这样把注册中心搞崩塌的

写公众号两年以来,每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来. 为什么呢?因为这样的话题很容易招来吐槽,比如 "说了半天,不就是配置没配好吗?",或者 "这代码是猪写的吗?你们团队有懂性能测试的同学吗?",这样的评论略带挑衅,而且充满了鄙视之意. 不过我觉得,在技术的世界里,多数情况都是客观场景决定了主观结果,而主观结果又反映了客观场景,把场景与结果串起来,用自己的方式写下来,传播出去,与有相同经历的同学聊上

什么!分布式缓存搞崩了注册中心?

每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来,为什么呢?因为这样的话题很容易招来吐槽,比如 “说了半天,不就是配置没配好吗?”,或者 “这代码是猪写的吗?你们团队有懂性能测试的同学吗?”,这样的评论略带挑衅,而且充满了鄙视之意. 不过我觉得,在技术的世界里,多数情况都是客观场景决定了主观结果,而主观结果又反映了客观场景,把场景与结果串起来,用自己的方式写下来,传播出去,与有相同经历的同学聊上一聊,也未尝不是一件好事. 上个月,我们的系统因注

大型网站技术架构,6网站的伸缩性架构之分布式缓存集群的伸缩性设计

和所有服务器都部署相同应用的应用服务器集群不同,分布式缓存服务器集群中不同的服务器中缓存的数据各不相同,缓存访问请求不可以在缓存服务器集群中的任意一台处理,必须先找到缓存有需要数据的服务器,然后才能访问. 这个特点制约了分布式缓存集群的伸缩性设计,因为新上线的缓存服务器没有缓存任何数据,而已下线的缓存服务器还缓存这网站的许多热点数据. 必须让新上线的缓存服务器对整个分布式缓存集群影响最小,也就是说新加入的缓存服务器应使整个缓存服务器集群中已经缓存的数据尽可能还被访问到,这是分布式缓存集群伸缩性设

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

ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年 正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完美的句号,回顾2016年,感受颇多,感恩那些帮助我的人.展望2017年,我相信一定会遇到一个更好的自己.附上自己喜欢的一张图片: 好了~~~装逼结束,下面开始说说如何实现分布式缓存在项目中的应用. part2:先分析以下需求 软件架构从单机到分布式遇到的问题(当然这是一个很深的问题,由于能力有限今天

大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

   前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分布式缓存). 一 概述 定义 MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间. 适用范围:数据量大,但是数据种类小可以放入内存. 基

Discuz!NT中集成Memcached分布式缓存

大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了磁盘I/O上(多个进程并发访问cache.config文件).其实从那时起我就开始关注有什么更好的方案,当然今天本文中所说的Memcached,以及Velocity等这类的分布式缓存方案之前都考虑过,但一直未能决定该使用那个.起码Velocity要在.net 4.0之后才会提供,虽然是原生态,但有些