通用缓存组件

8/3/2015来源:C#应用人气:879

通用缓存组件

  缓存有很多种,用的最普遍的可能就是内存缓存了。内存缓存的实现方式也有很多种,比如用静态变量,比如用Cache,但这些方式只针对单一缓存变量,每个缓存变量都要重新写一套方法,无法实现通用。这里提供一种通用的内存缓存组件,不用再为每个缓存做实现了。

  话不多说,先上代码:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Reflection; 5 using System.Text; 6 using System.Web; 7 using System.Web.Caching; 8  9 namespace Loncin.CodeGroup10.Utility10 {11     /// <summary>12     /// 通用缓存组件13     /// </summary>14     public class CacheHelper15     {16         /// <summary>17         /// 获取缓存对象18         /// </summary>19         /// <typeparam name="T">缓存实体对象</typeparam>20         /// <param name="dele">实体数据获取方法</param>21         /// <param name="cacheKey">缓存关键字</param>22         /// <param name="cacheDuration">缓存时间(分钟)</param>23         /// <param name="objs">实体数据获取参数</param>24         /// <returns>返回对象</returns>25         public static T GetCacheData<T>(Delegate dele, string cacheKey, int cacheDuration, params object[] objs)26         {27             // 缓存为空28             if (HttPRuntime.Cache.Get(cacheKey) == null)29             {30                 // 执行实体数据获取方法31                 MethodInfo methodInfo = dele.Method;32 33                 T result = (T)methodInfo.Invoke(dele.Target, objs);34 35                 if (result != null)36                 {37                     // 到期时间38                     DateTime cacheTime = DateTime.Now.AddMinutes(cacheDuration);39 40                     // 添加入缓存41                     HttpRuntime.Cache.Add(cacheKey, result, null, cacheTime, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null);42                 }43             }44 45             return (T)HttpRuntime.Cache[cacheKey];46         }47     }48 }

  1、缓存组件方法接收一个获取原始数据方法委托,一个缓存key,一个缓存过期时间,以及获取原始数据方法参数;

  2、缓存使用HttpRuntime.Cache实现,这是.net自带缓存组件,使用绝对缓存(当然根据需要也可以改成滑动缓存);

  3、方法先从缓存获取数据,缓存未取到数据,执行原始数据方法委托,获取数据,并添加入缓存。

  使用示例:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Loncin.CodeGroup10.Utility; 6  7 namespace Loncin.CodeGroup10.ConsoleTest.Test 8 { 9     /// <summary>10     /// 通用缓存组件测试11     /// </summary>12     public class CacheHelperTest13     {14         /// <summary>15         /// 测试方法16         /// </summary>17         public void Test()18         {19             // 获取数据20             var testData = CacheHelper.GetCacheData<List<int>>(new Func<int, List<int>>(GetTestData), "TestKey", 5, 10);21 22             if (testData != null && testData.Count > 0)23             {24                 Console.WriteLine("获取数据成功!");25             }26         }27 28         /// <summary>29         /// 获取原始数据30         /// </summary>31         /// <param name="count"></param>32         /// <returns></returns>33         public List<int> GetTestData(int count)34         {35             var testData = new List<int>();36             for (int i = 0; i < count; i++)37             {38                 testData.Add(i);39             }40 41             return testData;42         }43     }44 }

  总结:

  1、该缓存组件可以扩展,获取原始数据方法可以是调用服务,可以是发送Http请求等;

  2、缓存的方式也可以扩展,将HttpRuntime.Cache替换成Redis或其他缓存,甚至可以封装一个多级缓存方式的复杂缓存,这里让使用缓存的方式更方便。