利用Spring.Net技术打造可切换的分布式缓存读写类

8/10/2015来源:ASP.NET技巧人气:713

利用SPRing.Net技术打造可切换的分布式缓存读写类

  利用Spring.Net技术打造可切换的Memcached分布式缓存读写类

  Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具有高效的读写和分布式的优势,上一篇博文《Memcached在Windows下的配置和使用》已经对介绍过它在windows上的配置和使用。  新建ICacheWriter类--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实现它的工厂。  新建CacheHelper类,代码如下:复制代码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 }