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     }
  • 相关阅读:
    leetcode 268. Missing Number
    DBSCAN
    python二维数组初始化
    leetcode 661. Image Smoother
    leetcode 599. Minimum Index Sum of Two Lists
    Python中的sort() key含义
    leetcode 447. Number of Boomerangs
    leetcode 697. Degree of an Array
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月3日)
    北京Uber优步司机奖励政策(1月2日)
  • 原文地址:https://www.cnblogs.com/dianshi/p/4178057.html
Copyright © 2011-2022 走看看