通过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. 深入理解 /etc/fstab文件

    发布:thebaby   来源:net   [大 中 小] /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的 ...

  2. 分享:php 上传图片的代码

    转自:http://www.jbxue.com/article/6379.html php 上传图片的代码,很简单,实现了基本的文件类型.文件大小的检测,并实现了基本的水印与缩略功能,比较适合初学的朋 ...

  3. WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

    写Android程序的时候一般用WindowManager就是去获得屏幕的宽和高,来布局一些小的东西.基本上没有怎么看他的其他的接口. 这两天想写一个简单的类似于Toast的东西,自定义布局,突然发现 ...

  4. mouseout以及mouseover

    两个图层 红色图层代表outside蓝色图层代表inside dom结构如下 <div id="outside">      <div id="insi ...

  5. C++实现01串排序

    题目内容:将01串首先按长度排序,长度相同时,按1的个数从少到多进行排序,1的个数相同时再按ASCII码值排序. 输入描述:输入数据中含有一些01串,01串的长度不大于256个字符. 输出描述:重新排 ...

  6. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  7. python ssh

    使用python包paramiko实现通过ssh的安全远程访问 使用pip下载安装paramiko,提示会缺一个crypto包,用pip将这个包也安好,python就可以正常引用paramiko了 一 ...

  8. webpack 学习笔记 02 快速入门

    webpack 的目标 将依赖项分块,按需加载. 减少web app的初始加载时间. 使每一个静态集合都能够作为组件使用. 有能力集成第三方库,作为组件使用. 高度可配置化. 适用于大型项目. INS ...

  9. String类详解,StringBuffer

    先说一下String类的equals()方法. 下面我们先看一段代码: 这段代码输出的结果为: ture true -------------- false 咋看之下貌似Object类比较特别,那么我 ...

  10. main函数的argc和argv

      int main(int argc, char const *argv[]) { printf("argc : %c\n",argc); printf(] ); printf( ...