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

利用Spring.Net技术打造可切换的分布式缓存读写类的更多相关文章

  1. 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  2. 利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】

    转: 利用Spring的AbstractRoutingDataSource解决多数据源的问题 多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码, ...

  3. 【转帖】如何利用Spring Cloud构建起自我修复型分布式系统

    http://zhidao.baidu.com/link?url=tSKwdn3wr8KUxWMteHmneFtY0KoNZBMK9Xy-RimsdISA4h2neAecgHqggBipz2w6nXr ...

  4. 利用Spring Boot+zxing,生成二维码还能这么简单

    在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付.网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类. 本文目录 一.二维码简介二. ...

  5. 挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务

    挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务#36氪开放日# 其他 JasonZheng • 2012-04-07 15:14 来自36氪开放 ...

  6. Seafile 推出 “分布式文件同步技术” 打造的私有云服务

    近两年来 Dropbox 等云储存服务迅速窜红,各大巨头纷纷推出自家的云储存服务(苹果的 iCloud, 微软的 SkyDrive, Google 即将推出的 GDrive),国内也有类似的服务(金山 ...

  7. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  8. 利用 Dijit 组件框架打造丰富的用户界面

    原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...

  9. Spring AOP技术本质认识

    Spring AOP技术本质认识 一.AOP简介   AOP(Aspect Oriented Programming,面向切面编程),把某一类问题集中在一个地方进行处理,比如处理程序中的点击事件.打印 ...

随机推荐

  1. iOS 开发--github的demo

    令人惊讶的是,YYText 虽然代码量很大(超过一万行),但它只是 ibireme 的作品之一.ibireme 利用业余时间完成了 YYKit 工具库,包括: YYModel — 高性能的 iOS J ...

  2. JavaScript DOM编程基础精华03(动态设置,层的操作,性能问题)

    代码是否需要放置到onload中  //如果js代码需要操作页面上的元素,则将该代码放到onload里面.         //因为当页面加载完毕之后页面上才会有相关的元素 //如果js代码中没有操作 ...

  3. SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .

    今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...

  4. 转Unity 异常操作

    摘要 使用 unity 处理异常的方法可能会与你的直觉不符.本文将给出正确的处理方法,并简单剖析Unity这部分源代码. 处理异常 打算用Unity的AOP截获未处理的异常,然后写个日志什么的,于是我 ...

  5. 【翻译】JavaScript中的作用域和声明提前

    原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译开始=== 你知道下面的JavaScript脚本执 ...

  6. EINTR错误

    慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服 ...

  7. oracle 判断是不是数值/数字

    1. 利用 to_number CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)     RETURN NUMBER IS     v_st ...

  8. [Codeforces137A]Postcards and photos(模拟)

    题目链接:http://codeforces.com/contest/137/problem/A 题意:一个人搬东西,每次只能搬相同的东西,最多只能搬相同的东西不超过5个.问最少搬多少次. 模拟就行了 ...

  9. abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    abstract的method不可以是static的,因为抽象的方法是要被子类实现的,而static与子类扯不上关系! native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实 ...

  10. Java [Leetcode 268]Missing Number

    题目描述: Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is ...