缓存有很多种,用的最普遍的可能就是内存缓存了。内存缓存的实现方式也有很多种,比如用静态变量,比如用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或其他缓存,甚至可以封装一个多级缓存方式的复杂缓存,这里让使用缓存的方式更方便。
新闻热点
疑难解答