使用緩存服務Memcached

---恢復內容開始---數據庫

        緩存服務做爲系統中重要的一部分,我相信你們確定不陌生。緩存的概念和做用這裏就不作贅述,這篇文章只講我是如何封裝,如何併購入個人SOA框架以及如何使用。我採用的是使用量很廣的一個緩存服務:Memcached。若是你們對Memcached 不太熟悉,能夠百度,這裏不作詳細的介紹。下面詳細的介紹使用方法。緩存

   1.下載Memcached服務端,命令行輸入 'c:\memcached\memcached.exe -d install'   進行服務安裝服務器

   2.下載Enyim.Caching源代碼,在須要封裝的地方引用Enyim.Caching.dll框架

        3.在我SOA框架中加入ide

      <ServiceAddressInfo>
      <ServiceType>CacheService</ServiceType>
      <Name>緩存服務</Name>
      <Ip>127.0.0.1</Ip>
      <Port>11211</Port>
      <Alias>Service</Alias>
      </ServiceAddressInfo>memcached

        4.對Memcached客戶端代碼進行封裝:spa

  1 /// <summary>
  2 
  3 /// 緩存服務器代理
  4 
  5 /// </summary>
  6 
  7 public class MemcachedProxy
  8 
  9 {
 10 
 11 private static MemcachedClient _memcachedClient = null;
 12 
 13 private static MemcachedClientConfiguration _config = null;
 14 
 15 /// <summary>
 16 
 17 /// 獲取一個新的Session,操做完成後須要關閉
 18 
 19 /// </summary>
 20 
 21 /// <returns>返回一個新的Session。</returns>
 22 
 23 public static MemcachedClient NewSession()
 24 
 25 {
 26 
 27 try
 28 
 29 {
 30 
 31 if (_memcachedClient == null)
 32 
 33 {
 34 
 35 return new MemcachedClient(_config);
 36 
 37 }
 38 
 39 return _memcachedClient;
 40 
 41 }
 42 
 43 catch (Exception ex)
 44 
 45 {
 46 
 47 LogHelper.WriteModuleLog<MemcachedProxy>(ex);
 48 
 49 throw new Exception("鏈接緩存服務失敗");
 50 
 51 }
 52 
 53 }
 54 
 55 static MemcachedProxy()
 56 
 57 {
 58 
 59 //緩存服務   這個地方獲取的是我服務裏面是緩存服務的地址
 60 
 61 var cacheAddress = ServiceProxyFactory.AllServices.Find(r => r.ServiceType == ServiceTypeDefine.CacheService);
 62 
 63 var mcc = new MemcachedClientConfiguration();
 64 
 65 mcc.Servers.Add(new IPEndPoint(IPAddress.Parse(cacheAddress.Ip), cacheAddress.Port));
 66 
 67 mcc.NodeLocator = typeof(DefaultNodeLocator);
 68 
 69 mcc.KeyTransformer = typeof(SHA1KeyTransformer);
 70 
 71 mcc.Transcoder = typeof(DefaultTranscoder);
 72 
 73 mcc.SocketPool.MinPoolSize = 10;
 74 
 75 mcc.SocketPool.MaxPoolSize = 500;
 76 
 77 mcc.SocketPool.ConnectionTimeout = new TimeSpan(0, 0, 10);
 78 
 79 mcc.SocketPool.DeadTimeout = new TimeSpan(0, 0, 30);
 80 
 81 }
 82 
 83 /// <summary>
 84 
 85 /// 獲取緩存數據
 86 
 87 /// </summary>
 88 
 89 /// <typeparam name="T"></typeparam>
 90 
 91 /// <param name="key"></param>
 92 
 93 /// <returns></returns>
 94 
 95 public static T Get<T>(string key)
 96 
 97 {
 98 
 99 try
100 
101 {
102 
103 using (var cache = NewSession())
104 
105 {
106 
107 return cache.Get<T>(key);
108 
109 }
110 
111 }
112 
113 catch (Exception ex)
114 
115 {
116 
117 LogHelper.WriteDefaultLog(string.Format("獲取緩存失敗:{0}", ex.ToString()));
118 
119 return default(T);
120 
121 }
122 
123 }
124 
125 /// <summary>
126 
127 /// 存儲緩存數據
128 
129 /// </summary>
130 
131 /// <param name="data">數據</param>
132 
133 /// <param name="key">鍵值</param>
134 
135 public static void Store(object data,string key)
136 
137 {
138 
139 try
140 
141 {
142 
143 using (var cache = NewSession())
144 
145 {
146 
147 //默認存儲10分鐘
148 
149 cache.Store(StoreMode.Set, key, data, new TimeSpan(0, GlobalParameter.CacheDataSaveTime, 0));
150 
151 }
152 
153 }
154 
155 catch (Exception ex)
156 
157 {
158 
159 LogHelper.WriteDefaultLog(string.Format("存儲緩存數據失敗:{0}", ex.ToString()));
160 
161 }
162 
163 }
164 
165 }
View Code

  5.使用方法:命令行

 1 public void Execute(RequestModel rm, ResponseModel resM)
 2 {
 3 var data = rm.Parameters.ToObject<List<object>>();
 4 
 5 //先從緩存服務取得數據
 6 var cacheData = MemcachedProxy.Get<List<PortalsNoticeInfo>>(CacheParameter.Cache_PortalsNotice);
 7 
 8 //讀取緩存數據失敗
 9 if (cacheData == null || cacheData.Count == 0)
10 {
11 //從數據庫獲取
12 var result = _noticeManage.GetPublishedNotice(Int32.Parse(data[0].ToString()), Int32.Parse(data[1].ToString()));
13 
14 //寫入緩存
15 MemcachedProxy.Store(result, CacheParameter.Cache_PortalsNotice);
16 
17 //返回結果
18 resM.ResultData = result.ToJson();
19 resM.State = ResponseStateDefine.Success;
20 }
21 else
22 {
23 //返回結果
24 resM.ResultData = cacheData.ToJson();
25 resM.State = ResponseStateDefine.Success; 
26 }
27 }
View Code

 

(因爲代碼較多,可能不少地方沒詮釋明白,須要瞭解更多或者須要服務和源代碼的朋友能夠私下聯繫我)代理

相關文章
相關標籤/搜索