利用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 Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- 利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】
转: 利用Spring的AbstractRoutingDataSource解决多数据源的问题 多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码, ...
- 【转帖】如何利用Spring Cloud构建起自我修复型分布式系统
http://zhidao.baidu.com/link?url=tSKwdn3wr8KUxWMteHmneFtY0KoNZBMK9Xy-RimsdISA4h2neAecgHqggBipz2w6nXr ...
- 利用Spring Boot+zxing,生成二维码还能这么简单
在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付.网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类. 本文目录 一.二维码简介二. ...
- 挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务
挑战以Dropbox为代表的传统“同步网盘”,Seafile推出“分布式文件同步技术”打造的私有云服务#36氪开放日# 其他 JasonZheng • 2012-04-07 15:14 来自36氪开放 ...
- Seafile 推出 “分布式文件同步技术” 打造的私有云服务
近两年来 Dropbox 等云储存服务迅速窜红,各大巨头纷纷推出自家的云储存服务(苹果的 iCloud, 微软的 SkyDrive, Google 即将推出的 GDrive),国内也有类似的服务(金山 ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 利用 Dijit 组件框架打造丰富的用户界面
原文出处:Joe Lennon 从头开始学习 Dojo,第 3 部分 利用 Dijit 组件框架打造丰富的用户界面 Dijit 是什么? Dijit 是 Dojo 工具包的富组件用户界面库.这些组件完 ...
- Spring AOP技术本质认识
Spring AOP技术本质认识 一.AOP简介 AOP(Aspect Oriented Programming,面向切面编程),把某一类问题集中在一个地方进行处理,比如处理程序中的点击事件.打印 ...
随机推荐
- Android学习及开发随记1:Android Studio安装配置
1.本系列仅为个人使用,概不负责.随着时间推移,部分内容可能因为软件更新而出现不能对应的情况. 本文的配置情况,仅针对Android Studio v1.1.0 windows版本 全新安装. Goo ...
- *Linux之rpm命令
在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比"添加/删除程序"强很多,它就是Red Hat Package Mana ...
- Tomcat目录介绍以及运行时寻找class的顺序
来自:http://blog.csdn.net/lihai211/article/details/6651977 Tomcat下的文件目录 /bin:存放启动和关闭tomcat的脚本文件: /conf ...
- django定期执行任务
要在django项目中定期执行任务,比如每天一定的时间点抓取数据,刷新数据库等,可以参考stackoverflow的方法,先编写一个manage.py命令,然后使用crontab来定时执行这个命令. ...
- KMP入门题目[不定期更新]
HDU 1711 Number Sequence(模板题) #include <cstdio> ; ; int N, M; int textS[MAXN]; int tarS[MAXL]; ...
- BZOJ3122 随机数生成器
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3122 题意: 思路:(1)x1=t则n=1; (2)a=0,则b=t,n=2;否则无解: ...
- svn url does not contain valid patch
想把项目上传到svn上,由于误点击了apply patch.所以出现下面的错误. 正确做法是在项目上右击找到Team----share Project 如图: 点击share project后出现如图 ...
- LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton
将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0 A是一个n*n的矩阵,比如当n=5,d=1的时候: 不难发现,A是个循环矩阵,也就是将某一行所有元素统一 ...
- Linux shell下批量创建缩略图
一.背景 今天,突然发现手机客户端上的最新新闻缩略图都不显示了,上服务器上看了看, 发现新的新闻图片根本没有生成缩略图. 这套新闻发布系统是很老的程序了,查了一下,问题的原因是不支持png格式的图片, ...
- Android-Universal-Image-Loader
基本以后都不用了,所以自己就不总结了 http://www.cnblogs.com/kissazi2/p/3886563.html http://www.cnblogs.com/kissazi2/p/ ...