zoukankan      html  css  js  c++  java
  • 利用Spring.Net技术打造可切换的分布式缓存读写类

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

      Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具有高效的读写和分布式的优势,上一篇博文《Memcached在Windows下的配置和使用》已经对介绍过它在windows上的配置和使用。
     
      新建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.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的注入点。
     
      需要注意的是,因为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 : 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     }
  • 相关阅读:
    os和sys模块
    time模块
    collections模块
    re模块
    Python初识一
    Python闭包函数
    压栈
    isinstance()和issubclass()
    匿名函数--lambda函数
    机器学习入门文章
  • 原文地址:https://www.cnblogs.com/dianshi/p/4178057.html
Copyright © 2011-2022 走看看