Memcached是一個高性能的分佈式內存對象緩存系統,由於工做在內存,讀寫速率比數據庫高的不是通常的多,和Radis同樣具備高效的讀寫和分佈式的優點,上一篇博文《Memcached在Windows下的配置和使用》已經對介紹過它在windows上的配置和使用。html
代碼以下:算法
1 public interface ICacheWriter 2 { 3 void Set(string key, object value, DateTime exp); 4 void Set(string key, object value); 5 object Get(string key); 6 }
<add key="memcachedServer" value="127.0.0.1:11211" />
1 //單例模式 2 private static readonly MemcachedClient client; 3 static MemcachedWriter() 4 { 5 6 string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 7 8 //初始化socket池 9 SockIOPool pool = SockIOPool.GetInstance(); 10 pool.SetServers(servers); 11 pool.InitConnections = 1; 12 pool.MinConnections = 1; 13 pool.MaxConnections = 3; 14 pool.SocketConnectTimeout = 1000;//socket鏈接超時,閒置多少毫秒後銷燬socket 15 pool.SocketTimeout = 3000; 16 pool.MaintenanceSleep = 30;//維護線程休息時間 17 pool.Failover = true;//失效轉移(一種備份操做模式) 18 pool.Nagle = false;//是否用nagle算法啓動socket 19 pool.Initialize();//應用設置並初始化socket池 20 21 //建立memcached客戶端 22 client = new MemcachedClient(); 23 client.EnableCompression = false;//是否進行壓縮 24 25 } 26 public void Set(string key, object value, DateTime exp) 27 { 28 client.Set(key, value, exp); 29 } 30 31 public void Set(string key, object value) 32 { 33 client.Set(key, value); 34 } 35 36 public object Get(string key) 37 { 38 return client.Get(key); 39 }
這樣就能夠經過配置來添加和修改服務器。spring
有了接口類和實現類,下一步咱們就要利用Spring.Net實現它的工廠。數據庫
1 public class CacheHelper 2 { 3 public static ICacheWriter CacheWriter { get; set; } 4 5 static CacheHelper() 6 { 7 //若是是靜態的屬性,想讓它有注入的值,就必須先建立一個實例後,才能注入 8 //靜態方法調用的時候,不須要Spring容器建立實例,因此屬性CacheWriter沒有注入實例 9 //在類的靜態構造函數中強制讓Spring容器爲咱們建立一個屬性的實例,由於屬性是靜態的,因此只須要建立一次便可 10 11 IApplicationContext ctx = ContextRegistry.GetContext(); 12 ctx.GetObject("CacheHelper"); 13 14 } 15 public static void WriteCache(string key,object value,DateTime exp) 16 { 17 CacheWriter.Set(key, value, exp); 18 } 19 public static void WriteCache(string key, object value) 20 { 21 CacheWriter.Set(key, value); 22 } 23 24 public static object GetCache(string key) 25 { 26 return CacheWriter.Get(key); 27 } 28 }
public static ICacheWriter CacheWriter { get; set; }
這個屬性就是Spring.Net的注入點。windows
須要注意的是,由於Spring.Net只會在類有了第一個實例後纔會進行注入,而靜態方法內只能調用靜態字段,靜態方法和靜態字段是在程序開始運行時就已經建立好了,此時CacheHelper尚未第一個實例,因此靜態字段CacheWriter沒有被注入,須要手動實例化CacheHelper,讓CacheWriter被注入。緩存
在配置文件的Spring節點中添加關於CacheHelper和CacheWriter的配置信息:服務器
1 <objects xmlns="http://www.springframework.net"> 2 <!--CacheHelper中的CacheWriter的注入,CacheWriter是單例的--> 3 <object name="CacheHelper" type="MyOA_Common.CacheHelper, MyOA_Common" singleton="false"> 4 <property name="CacheWriter" ref="MemcachedWriter" /> 5 </object> 6 <object name="MemcachedWriter" type="MyOA_Common.MemcachedWriter, MyOA_Common" singleton="true"> 7 8 </object> 9 </objects>
若是咱們想使用httpruntime.cache而不想用Memcached進行緩存讀寫,只須要修改app
<object name="MemcachedWriter" type="MyOA_Common.MemcachedWriter, MyOA_Common" singleton="true">
使用Spring.Net和接口加強了咱們程序的靈活性。
好了,咱們在控制器上測試一下代碼:
1 public class TestController : Controller 2 { 3 // GET: /Test/ 4 public ActionResult Test() 5 { 6 CacheHelper.CacheWriter.Set("test", "測試成功"); 7 return View(); 8 } 9 10 [HttpPost] 11 public ActionResult Test(FormCollection form) 12 { 13 string value = (string)CacheHelper.CacheWriter.Get("test"); 14 return Content(value); 15 } 16 17 }
網頁上顯示「測試成功」,即分佈式緩存完成!socket