---恢復內容開始---數據庫
緩存服務做爲系統中重要的一部分,我相信你們確定不陌生。緩存的概念和做用這裏就不作贅述,這篇文章只講我是如何封裝,如何併購入個人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 }
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 }
(因爲代碼較多,可能不少地方沒詮釋明白,須要瞭解更多或者須要服務和源代碼的朋友能夠私下聯繫我)代理