利用Spring.Net技術打造可切換的Memcached分布式緩存讀寫類
Memcached是一個高性能的分布式內存對象緩存系統,因為工作在內存,讀寫速率比數據庫高的不是一般的多,和Radis一樣具有高效的讀寫和分布式的優勢,上一篇博文《Memcached在Windows下的配置和使用》已經對介紹過它在windows上的配置和使用?! ⌒陆↖CacheWriter類--CacheWriter的接口,以達到通過配置文件可以切換緩存讀寫方式,例如,緩存讀寫也可以通過httpruntime.cache來進行。代碼如下:復制代碼1 public interface ICacheWriter2 {3 void Set(string key, object value, DateTime exp);4 void Set(string key, object value);5 object Get(string key);6 }復制代碼在配置文件中的appSettings節點下添加memcached服務器地址。例如:<add key="memcachedServer" value="127.0.0.1:11211" />新建MemcachedWriter類,代碼如下:復制代碼1 //單例模式2 private static readonly MemcachedClient client;3 static MemcachedWriter()4 { 56 string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);78 //初始化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連接超時,閑置多少毫秒后銷毀socket15 pool.SocketTimeout = 3000;16 pool.MaintenanceSleep = 30;//維護線程休息時間17 pool.Failover = true;//失效轉移(一種備份操作模式) 18 pool.Nagle = false;//是否用nagle算法啟動socket19 pool.Initialize();//應用設置并初始化socket池2021 //創建memcached客戶端22 client = new MemcachedClient();23 client.EnableCompression = false;//是否進行壓縮2425 }26 public void Set(string key, object value, DateTime exp)27 {28 client.Set(key, value, exp);29 }3031 public void Set(string key, object value)32 {33 client.Set(key, value);34 }3536 public object Get(string key)37 {38 return client.Get(key);39 } 復制代碼這樣就可以通過配置來添加和修改服務器。 有了接口類和實現類,下一步我們就要利用Spring.Net實現它的工廠?! ⌒陆–acheHelper類,代碼如下:復制代碼1 public class CacheHelper2 {3 public static ICacheWriter CacheWriter { get; set; }45 static CacheHelper()6 {7 //如果是靜態的屬性,想讓它有注入的值,就必須先創建一個實例后,才能注入8 //靜態方法調用的時候,不需要Spring容器創建實例,所以屬性CacheWriter沒有注入實例9 //在類的靜態構造函數中強制讓Spring容器為我們創建一個屬性的實例,因為屬性是靜態的,所以只需要創建一次即可1011 IapplicationContext ctx = ContextRegistry.GetContext();12 ctx.GetObject("CacheHelper");1314 }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 }2324 public static object GetCache(string key)25 {26 return CacheWriter.Get(key);27 }28 }復制代碼public static ICacheWriter CacheWriter { get; set; }這個屬性就是Spring.Net的注入點?! ⌒枰⒁獾氖?,因為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進行緩存讀寫,只需要修改<object name="MemcachedWriter" type="MyOA_Common.MemcachedWriter, MyOA_Common" singleton="true">使用Spring.Net和接口增強了我們程序的靈活性。好了,我們在控制器上測試一下代碼:復制代碼1 public class TestController : Controller2 {3 // GET: /Test/4 public ActionResult Test()5 {6 CacheHelper.CacheWriter.Set("test", "測試成功");7 return View();8 }910 [HttpPost]11 public ActionResult Test(FormCollection form)12 {13 string value = (string)CacheHelper.CacheWriter.Get("test");14 return Content(value);15 }1617 }新聞熱點
疑難解答