利用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

本文目的是与各位园友交流和分享经验,若是您发现本文中有什么错误或者您有什么更好的建议,欢迎您提出!若是您对文中描述的东西有不了解的地方也能够回复或者查看个人其余博文。

相关文章
相关标签/搜索