zoukankan      html  css  js  c++  java
  • 通用缓存组件

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

  • 相关阅读:
    第八周
    请停止使用strncpy
    WER设置
    如何在dump文件里找到真正的类this指针
    Visual Studio /analyze不好之处---漏报(四)
    Visual Studio /analyze不好之处---漏报(三)
    Visual Studio /analyze不好之处---漏报(二)
    Visual Studio /analyze不好之处(一)
    Visual Studio /analyze的好处
    符号杂谈
  • 原文地址:https://www.cnblogs.com/loncin/p/4224196.html
Copyright © 2011-2022 走看看