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

网页上显示“测试成功”,即分布式缓存完成!

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

时间: 2024-08-08 09:36:42

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

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

http://zhidao.baidu.com/link?url=tSKwdn3wr8KUxWMteHmneFtY0KoNZBMK9Xy-RimsdISA4h2neAecgHqggBipz2w6nXrvD3MmcPbiP5Q6ketfpz03gDLZRoh86p_eVa8bRpe 利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战. 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们也能轻松举出由其带来的诸多比较优

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

近两年来 Dropbox 等云储存服务迅速窜红,各大巨头纷纷推出自家的云储存服务(苹果的 iCloud, 微软的 SkyDrive, Google 即将推出的 GDrive),国内也有类似的服务(金山网盘.袋鼠盘.坚果云等).用户只需将自己的文件资料储存到这些云储存空间上,就可以从自己的台式机.手机.平板等终端设备随时随地访问自己的文件资料,用户如果在一个地方更新文件,其它地方也会自动同步. 挑战以 Dropbox 为代表的传统 “同步网盘”,Seafile 推出 “分布式文件同步技术” 打造的

利用Spring Roo搭建spring/springMVC/jpa(hibernate)

之前看spring实战的时候,书中提到spring roo工具,一直没有来得及尝试. 这次十一,我和女友一致认为前两天人太挤出去是受罪,于是就窝在了家里,就有了点时间来研究一下技术. 好了,言归正传 ,我比较懒,所以一直在寻找最简单的办法去完成一些事情. 对于框架集成也是如此 ,已经尝试过各种方法了,就是为了寻找更简单,实用. 本次是利用Spring Roo进行搭建,认为是目前最简单的了,并且Roo的配置几乎都是最佳实践. -------------------------------PART1

利用Spring的AbstractRoutingDataSource解决多数据源的问题(转)

多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码,涉及到多数据源的问题. 研究成果如下: 1.首先配置多个datasource [html] view plaincopy <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"

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

作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MVC与json参考文章:[spring学习笔记-mvc-3]返回json数据-方式1  和 [spring学习笔记-mvc-4]返回json数据-方式2. 使用到的技术主要如下: Ajax:使用JQuery 提供的ajax:==>需要引入jquery.min.js文件: Spring MVC: Jso

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈开发企业级认证与授权网盘地址:https://pan.baidu.com/s/1mj8u6JQ 密码: 92rp备用地址(腾讯微云):https://share.weiyun.com/8b2ffc1839069b4399950333860754a4 密码:a539tn 第1章 课程导学介绍课程内容.课程特点,使用的主要技术栈,以及学习课程所需的前置知识 第2章 开始开发安装开发工具,介绍项目代码结构并搭建,基本的依赖和参数设置,开发hello world 第3

基于Spring Boot技术栈 博客系统企业级前后端实战 渐进式讲解+Thymeleaf+Elasticsearch+多种数据库

第1章 Spring Boot 简介讲解Spring Boot的项目背景,已经与其他技术框架(比如,Spring.SpringMVC.SpringCloud等)的关系.简单介绍下Spring Boot 整个生态系统1-1 _Spring Boot博客_课程导学1-2 -Spring Boot 是什么 第2章 开启 Spring Boot 的第一个 Web 项目通过 Spring Initializr 来快速初始化一个 Spring Boot 原型,方便学员来极速体验Spring Boot.本课程

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

利用pushState开发无刷页面切换

利用pushState开发无刷页面切换<转> 相关文档:https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulatingthebrowser_history 实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的认识) 在不支持的浏览器下降级成传统网页的方式 使用到的API history.state 当前URL下对应的状态信息.如果当前URL不是通过pushSta