当前位置: 移动技术网 > IT编程>开发语言>.net > 利用Spring.Net技术打造可切换的分布式缓存读写类

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

2017年12月25日  | 移动技术网IT编程  | 我要评论

深赛格股吧,古穿今之安居乐业,落伍小说

利用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="https://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     }

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网