缓存有很多种,用的最普遍的可能就是内存缓存了。内存缓存的实现方式也有很多种,比如用静态变量,比如用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.Utility 10 { 11 /// <summary> 12 /// 通用缓存组件 13 /// </summary> 14 public class CacheHelper 15 { 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 CacheHelperTest 13 { 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或其他缓存,甚至可以封装一个多级缓存方式的复杂缓存,这里让使用缓存的方式更方便。