• 通过spring.net中的spring.caching CacheResult实现memcached缓存


    通过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
      1 using System;
      2 using Spring.Caching;
      3 using System.Web;
      4 using System.Collections;
      5 using System.Web.Caching;
      6 using Enyim.Caching;
      7 using Enyim.Caching.Memcached;
      8 
      9 namespace Demo.Common
     10 {
     11     /// <summary>
     12     /// An <see cref="ICache"/> implementation backed by ASP.NET Cache (see <see cref="HttpRuntime.Cache"/>).
     13     /// </summary>
     14     /// <remarks>
     15     /// <para>
     16     /// Because ASP.NET Cache uses strings as cache keys, you need to ensure
     17     /// that the key object type has properly implemented <b>ToString</b> method.
     18     /// </para>
     19     /// <para>
     20     /// Despite the shared underlying <see cref="HttpRuntime.Cache"/>, it is possible to use more than
     21     /// one instance of <see cref="AspNetCache"/> without interfering each other.
     22     /// </para>
     23     /// </remarks>
     24     /// <author>Aleksandar Seovic</author>
     25     /// <author>Erich Eichinger</author>
     26     public class SpringMemcachedCache : AbstractCache
     27     {
     28         #region Fields
     29 
     30         // logger instance for this class
     31         private static MemcachedClient memcachedClient = null;
     32         private static object initLock = new object();
     33 
     34         #endregion
     35 
     36         private MemcachedClient MemcachedClient
     37         {
     38             get
     39             {
     40                 if (memcachedClient == null)
     41                 {
     42                     lock (initLock)
     43                     {
     44                         if (memcachedClient == null)
     45                         {
     46                             memcachedClient = new MemcachedClient();
     47                         }
     48                     }
     49                 }
     50 
     51                 return memcachedClient;
     52             }
     53         }
     54 
     55         /// <summary>
     56         /// Retrieves an item from the cache.
     57         /// </summary>
     58         /// <param name="key">
     59         /// Item key.
     60         /// </param>
     61         /// <returns>
     62         /// Item for the specified <paramref name="key"/>, or <c>null</c>.
     63         /// </returns>
     64         public override object Get(object key)
     65         {
     66             object result = key == null ? null : MemcachedClient.Get(GenerateKey(key));
     67             return result;
     68         }
     69 
     70         /// <summary>
     71         /// Removes an item from the cache.
     72         /// </summary>
     73         /// <param name="key">
     74         /// Item key.
     75         /// </param>
     76         public override void Remove(object key)
     77         {
     78             if (key != null)
     79             {
     80                 MemcachedClient.Remove(GenerateKey(key));
     81             }
     82         }
     83 
     84         /// <summary>
     85         /// Inserts an item into the cache.
     86         /// </summary>
     87         /// <param name="key">
     88         /// Item key.
     89         /// </param>
     90         /// <param name="value">
     91         /// Item value.
     92         /// </param>
     93         /// <param name="timeToLive">
     94         /// Item's time-to-live (TTL).
     95         /// </param>
     96         protected override void DoInsert(object key, object value, TimeSpan timeToLive)
     97         {
     98             MemcachedClient.Store(StoreMode.Set, GenerateKey(key), value, timeToLive);
     99         }
    100 
    101         /// <summary>
    102         /// Generate a key to be used for the underlying <see cref="Cache"/> implementation.
    103         /// </summary>
    104         /// <param name="key"></param>
    105         /// <returns></returns>
    106         public string GenerateKey(object key)
    107         {
    108             return key.ToString();
    109         }
    110 
    111         public override ICollection Keys
    112         {
    113             get { throw new NotSupportedException(); }
    114         }
    115     }
    116 }

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

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <configuration>
     3   <configSections>
     4     <sectionGroup name="enyim.com">
     5       <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching"/>
     6       <!-- log -->
     7       <section name="log" type="Enyim.Caching.Configuration.LoggerSection, Enyim.Caching" />
     8     </sectionGroup>
     9 
    10     <sectionGroup name="spring">
    11       <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    12       <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    13     </sectionGroup>
    14   </configSections>
    15   
    16   <enyim.com>
    17     <memcached>
    18       <servers>
    19         <add address="127.0.0.1" port="11211"/>
    20       </servers>
    21       <socketPool minPoolSize="10" maxPoolSize="100" connectionTimeout="00:00:10" deadTimeout="00:02:00"/>
    22     </memcached>
    23   </enyim.com>
    24 
    25   <spring>
    26     <context>
    27       <resource uri="config://spring/objects" />
    28     </context>
    29     <objects xmlns="http://www.springframework.net"  >
    30       <object id="CacheAspect" type="Spring.Aspects.Cache.CacheAspect, Spring.Aop"/>
    31       <object id="autoBOProxyCreator" type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop">
    32         <property name="ObjectNames">
    33           <list>
    34             <value>*BO</value>
    35           </list>
    36         </property>
    37         <property name="InterceptorNames">
    38           <list>
    39             <value>CacheAspect</value>
    40           </list>
    41         </property>
    42       </object>
    43 
    44       <object id="cachedTestBO" type="Demo.App.CachedTestBO, Demo.App"></object>
    45       
    46       <object id="MemCachedCache" type="Demo.Common.SpringMemcachedCache, Demo.Common">
    47         <property name="TimeToLive" value="00:05:00"/>
    48       </object>
    49 
    50       <object id="MemCachedCache-Short" type="Demo.Common.SpringMemcachedCache, Demo.Common">
    51           <property name="TimeToLive" value="00:05:00"/>
    52       </object>
    53 
    54       <object id="MemCachedCache-Long" type="Demo.Common.SpringMemcachedCache, Demo.Common">
    55           <property name="TimeToLive" value="00:30:00"/>
    56       </object>
    57 
    58     </objects>
    59   </spring>
    60   
    61 
    62 </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(1, new object[]{"one", "two"}));
    
                    Console.WriteLine();
    
                    Thread.Sleep(5);   //休眠5秒以便第二次调用查看是否有保存到memcached
    
                    //第二次运行从memcached中读取数据
                    Console.WriteLine("nowTime:" + DateTime.Now.ToString("T")
                        + " testTime:" + service.TestMethod(1, new object[] { "one", "two" }));
    
                    Console.WriteLine();
    
                }
    
                //手动实例化,不会从memcached中读取数据,因为没有运行到CacheResult中去
                ITestBO test = new CachedTestBO();
                test.TestMethod(2);
    
                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类

     1 namespace Demo.Common
     2 {
     3     public static class ApplicationVariables
     4     {
     5         private static string countryCode;
     6         public static string CountryCode
     7         {
     8             get
     9             {
    10                 if (countryCode == null)
    11                 {
    12                     countryCode = "HK";
    13                 }
    14                 return countryCode;
    15             }
    16         }
    17     }
    18 
    19     public static class SpringCache
    20     {
    21         public const string SpringCacheCountryPrefix = @"T(Demo.Common.ApplicationVariables).CountryCode + '-'";
    22         public const string NormalCache = "MemCachedCache";
    23 
    24         public const string AspnetCache = "AspnetCache";
    25     }
    26 
    27     public static class SpringCacheKey
    28     {
    29         public const string MainSubAccountMap = "MainSubAccountMap";
    30 
    31         public const string BOSetting = "BOSetting";
    32     }
    33 }

     

  • 相关阅读:
    Python 第八章笔记
    B树和B+树的总结
    哈希表总结
    Redis基本数据结构总结之STRING和LIST
    红黑树之删除原理和实现
    红黑树之插入实现
    对排名前3000位博主进行数据分析
    o(n)线性排序算法
    排序算法总结
    贪心算法 题型总结
  • 原文地址:https://www.cnblogs.com/dfg727/p/3245221.html
Copyright © 2020-2023  润新知