前言
上一篇《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" /> <asp:Button ID="btnGet" runat="server" Text="獲取" OnClick="btnGet_Click" /> <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打開。同時希望各位大神指導下,呵呵。