利用Spring.Net技術打造可切換的分佈式緩存讀寫類 Memcached在Windows下的配置和使用

利用Spring.Net技術打造可切換的Memcached分佈式緩存讀寫類

Memcached是一個高性能的分佈式內存對象緩存系統,由於工做在內存,讀寫速率比數據庫高的不是通常的多,和Radis同樣具備高效的讀寫和分佈式的優點,上一篇博文Memcached在Windows下的配置和使用已經對介紹過它在windows上的配置和使用。html

新建ICacheWriter類--CacheWriter的接口,以達到經過配置文件能夠切換緩存讀寫方式,例如,緩存讀寫也能夠經過httpruntime.cache來進行。

代碼以下:算法

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 }

在配置文件中的appSettings節點下添加memcached服務器地址。例如:

<add key="memcachedServer" value="127.0.0.1:11211" />

新建MemcachedWriter類,代碼以下:

 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實現它的工廠。數據庫

新建CacheHelper類,代碼以下:

 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

本文目的是與各位園友交流和分享經驗,若是您發現本文中有什麼錯誤或者您有什麼更好的建議,歡迎您提出!若是您對文中描述的東西有不瞭解的地方也能夠回覆或者查看個人其餘博文。

相關文章
相關標籤/搜索