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


前言

  上一篇《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操作

  在實際開發中,創建客戶端的實例是昂貴的。 這里就創建一個單一的客戶端實例,也就是單列。

  第一步:緩存接口  

 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");

啟用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=1 -c 127.0.0.1  -u Administrator -p 123456

  如果成功的話,服務器會返回一個說明:SUCCESS: bucket-edit。然后重啟Couchbase服務即可。

  

總結

  這一篇主要是學習如何在項目中的簡單使用,現在做的項目中,應用.Net的緩存作處理。如果有機會一定要在項目中用Couchbase進行實踐,那樣才會更深入。

代碼百度網盤,VS2015打開。同時希望各位大神指導下,呵呵。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM