通过spring.net中的spring.caching CacheResult实现memcached缓存
1.SpringMemcachedCache.cs
2.APP.config
3.Program.cs
4.Common
待解决问题:CacheResult,CacheResultItems有什么区别????

SpringMemcachedCache.cs   memcached的实现, 继承了Spring.Caching.AbstractCache, memcached的实现用了Enyim.Caching
 using System;
using Spring.Caching;
using System.Web;
using System.Collections;
using System.Web.Caching;
using Enyim.Caching;
using Enyim.Caching.Memcached; namespace Demo.Common
{
/// <summary>
/// An <see cref="ICache"/> implementation backed by ASP.NET Cache (see <see cref="HttpRuntime.Cache"/>).
/// </summary>
/// <remarks>
/// <para>
/// Because ASP.NET Cache uses strings as cache keys, you need to ensure
/// that the key object type has properly implemented <b>ToString</b> method.
/// </para>
/// <para>
/// Despite the shared underlying <see cref="HttpRuntime.Cache"/>, it is possible to use more than
/// one instance of <see cref="AspNetCache"/> without interfering each other.
/// </para>
/// </remarks>
/// <author>Aleksandar Seovic</author>
/// <author>Erich Eichinger</author>
public class SpringMemcachedCache : AbstractCache
{
#region Fields // logger instance for this class
private static MemcachedClient memcachedClient = null;
private static object initLock = new object(); #endregion private MemcachedClient MemcachedClient
{
get
{
if (memcachedClient == null)
{
lock (initLock)
{
if (memcachedClient == null)
{
memcachedClient = new MemcachedClient();
}
}
} return memcachedClient;
}
} /// <summary>
/// Retrieves an item from the cache.
/// </summary>
/// <param name="key">
/// Item key.
/// </param>
/// <returns>
/// Item for the specified <paramref name="key"/>, or <c>null</c>.
/// </returns>
public override object Get(object key)
{
object result = key == null ? null : MemcachedClient.Get(GenerateKey(key));
return result;
} /// <summary>
/// Removes an item from the cache.
/// </summary>
/// <param name="key">
/// Item key.
/// </param>
public override void Remove(object key)
{
if (key != null)
{
MemcachedClient.Remove(GenerateKey(key));
}
} /// <summary>
/// Inserts an item into the cache.
/// </summary>
/// <param name="key">
/// Item key.
/// </param>
/// <param name="value">
/// Item value.
/// </param>
/// <param name="timeToLive">
/// Item's time-to-live (TTL).
/// </param>
protected override void DoInsert(object key, object value, TimeSpan timeToLive)
{
MemcachedClient.Store(StoreMode.Set, GenerateKey(key), value, timeToLive);
} /// <summary>
/// Generate a key to be used for the underlying <see cref="Cache"/> implementation.
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string GenerateKey(object key)
{
return key.ToString();
} public override ICollection Keys
{
get { throw new NotSupportedException(); }
}
}
}

APP.config  配置enyim.com, memcache, spring.net

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="enyim.com">
<section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>
<!-- log -->
<section name="log" type="Enyim.Caching.Configuration.LoggerSection, Enyim.Caching" />
</sectionGroup> <sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections> <enyim.com>
<memcached>
<servers>
<add address="127.0.0.1" port=""/>
</servers>
<socketPool minPoolSize="" maxPoolSize="" connectionTimeout="00:00:10" deadTimeout="00:02:00"/>
</memcached>
</enyim.com> <spring>
<context>
<resource uri="config://spring/objects" />
</context>
<objects xmlns="http://www.springframework.net" >
<object id="CacheAspect" type="Spring.Aspects.Cache.CacheAspect, Spring.Aop"/>
<object id="autoBOProxyCreator" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">
<property name="ObjectNames">
<list>
<value>*BO</value>
</list>
</property>
<property name="InterceptorNames">
<list>
<value>CacheAspect</value>
</list>
</property>
</object> <object id="cachedTestBO" type="Demo.App.CachedTestBO, Demo.App"></object> <object id="MemCachedCache" type="Demo.Common.SpringMemcachedCache, Demo.Common">
<property name="TimeToLive" value="00:05:00"/>
</object> <object id="MemCachedCache-Short" type="Demo.Common.SpringMemcachedCache, Demo.Common">
<property name="TimeToLive" value="00:05:00"/>
</object> <object id="MemCachedCache-Long" type="Demo.Common.SpringMemcachedCache, Demo.Common">
<property name="TimeToLive" value="00:30:00"/>
</object> </objects>
</spring> </configuration>

App Program.cs       测试效果

1.要从spring中进入的才会调用, 直接实例化进入不会调用

2.CacheName - "SpringCache" 对应spring配置中的id="SpringCache"节点,是实现cache的类

3.Key="'prefix.key.'+#cacheId" 传人cachedId=1对应生成以后的key为 prefix.key.1
复杂点的Key组合见下面

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Demo.Common;
using Spring.Caching;
using Spring.Context;
using Spring.Context.Support; namespace Demo.App
{
class Program
{
private static void Main(string[] args)
{
//通过spring.net来调用函数
IApplicationContext ctx = ContextRegistry.GetContext(); IDictionary testDictionary = ctx.GetObjectsOfType(typeof(ITestBO));
foreach (DictionaryEntry entry in testDictionary)
{
string name = (string)entry.Key;
ITestBO service = (ITestBO)entry.Value;
Console.WriteLine(name + " intercept: ");
          
//第一次运行函数并保存到memcached
Console.WriteLine("nowTime:" + DateTime.Now.ToString("T")
+ " testTime:" +service.TestMethod(, new object[]{"one", "two"})); Console.WriteLine(); Thread.Sleep(); //休眠5秒以便第二次调用查看是否有保存到memcached //第二次运行从memcached中读取数据
Console.WriteLine("nowTime:" + DateTime.Now.ToString("T")
+ " testTime:" + service.TestMethod(, new object[] { "one", "two" })); Console.WriteLine(); } //手动实例化,不会从memcached中读取数据,因为没有运行到CacheResult中去
ITestBO test = new CachedTestBO();
test.TestMethod(); Console.ReadLine();
}
} public interface ITestBO
{
string TestMethod(int cacheId, params object[] elements);
} public class CachedTestBO : ITestBO
{
//生成的key类似HK-MainSubAccountMap-1
[CacheResult(CacheName = SpringCache.NormalCache,
Key = SpringCache.SpringCacheCountryPrefix
+"+'" + SpringCacheKey.MainSubAccountMap + "'"
+ "+'-' + #cacheId")]
public string TestMethod(int cacheId, params object[] elements)
{
return DateTime.Now.ToString("T");
}
} }

Common类

 namespace Demo.Common
{
public static class ApplicationVariables
{
private static string countryCode;
public static string CountryCode
{
get
{
if (countryCode == null)
{
countryCode = "HK";
}
return countryCode;
}
}
} public static class SpringCache
{
public const string SpringCacheCountryPrefix = @"T(Demo.Common.ApplicationVariables).CountryCode + '-'";
public const string NormalCache = "MemCachedCache"; public const string AspnetCache = "AspnetCache";
} public static class SpringCacheKey
{
public const string MainSubAccountMap = "MainSubAccountMap"; public const string BOSetting = "BOSetting";
}
}

通过spring.net中的spring.caching CacheResult实现memcached缓存的更多相关文章

  1. Spring MVC 中的http Caching

    文章目录 过期时间 Last-Modified ETag Spring ETag filter Spring MVC 中的http Caching Cache 是HTTP协议中的一个非常重要的功能,使 ...

  2. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块

    spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可 ...

  3. Spring Boot中使用 Spring Security 构建权限系统

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全 ...

  4. Spring Boot 中应用Spring data mongdb

    摘要 本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考. 文末有代码链接 准备 安装mongodb 需要连接mongodb,所 ...

  5. 如何在静态方法或非Spring Bean中注入Spring Bean

           在项目中有时需要根据需要在自己new一个对象,或者在某些util方法或属性中获取Spring Bean对象,从而完成某些工作,但是由于自己new的对象和util方法并不是受Spring所 ...

  6. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  7. 【swagger】1.swagger提供开发者文档--简单集成到spring boot中【spring mvc】【spring boot】

    swagger提供开发者文档 ======================================================== 作用:想使用swagger的同学,一定是想用它来做前后台 ...

  8. Spring Boot中集成Spring Security 专题

    check to see if spring security is applied that the appropriate resources are permitted: @Configurat ...

  9. 在非spring组件中注入spring bean

    1.在spring中配置如下<context:spring-configured/>     <context:load-time-weaver aspectj-weaving=&q ...

随机推荐

  1. 一个PHP邮件伪造脚本

    xx.html <html> <head> <title>邮件欺骗</title> <body> <h3>社工必备-邮件欺骗&l ...

  2. C++12!配对

    题目内容:找出输入数据中所有两两相乘的积为12!的对数. 输入描述:输入数据中含有一些整数n(1<=n<232). 输出描述:输出所有两两相乘的积为12!的对数. 题目分析:对于输入的每个 ...

  3. jQuery toggle方法的一个奇怪表现。

    function buildTree() { //$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title' ...

  4. 一个朋友js图表开发遇到的问题 解决思路c和js

    引言            不求知道一切, 只求发现一件 -- 乔治·西蒙·欧姆 附注:那些存在于梦幻中的事迹,那些儿时梦中的人物,每每看起,都觉得 .哎 .... 岁月 ... 一直在努力 ...  ...

  5. 企业该如何进行高效IT运维管理

    企业该如何进行高效IT运维管理 在企业内部也是一样,当大量的生产和经营数据集中在数据中心,一旦人们与数据中心因为IT故障而失去联系,停滞的也许不是个人应用受阻这样简单的后果.我们谁也不想看到自己企业的 ...

  6. VS2012 常用web.config配置解析之自定义配置节点

    在web.config文件中拥有一个用户自定义配置节点configSections,这个节点可以方便用户在web.config中随意的添加配置节点,让程序更加灵活(主要用于第三方插件的配置使用) 自定 ...

  7. pb datawindow 判断是否是最后一列最后一行

    li_column1 = GetColumn() ls_columnname = GetColumnName() Send(Handle(This),,,Long(,)) ll_row2 = GetR ...

  8. 设置搜狗输入法在任何时候按左右两侧的shift激活

    如上图,搜狗输入法for linux最近与广大用户见面了,现在的版本是1.0.0.0014,本人系统是ubuntu 14.04非麒麟版本 使用过程中有个习惯就是在任何窗口内只要按任意一侧的shift就 ...

  9. win7 系统如何设置快速启动栏

    a.在任务栏上右键 -> 工具栏 -> 新建工具栏 -> 跳出选择文件夹对话框,在文件夹里面(光标山洞处)输入这个路径,然后按回车: %userprofile%\AppData\Ro ...

  10. [Android Training视频系列] 8.3 Dealing with Audio Output Hardware

    用户在播放音乐的时候有多个选择,可以使用内置的扬声器,有线耳机或者是支持A2DP的蓝牙耳机.(补充:A2DP全名是Advanced Audio Distribution Profile 蓝牙音频传输模 ...