通用缓存组件

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

时间: 2024-10-18 10:30:21

通用缓存组件的相关文章

iOS 通用缓存:HanekeSwift

iOS 通用缓存:HanekeSwift Haneke 是个采用 Swift 编写的轻量级 iOS 通用缓存.示例: 初始化一个数据缓存: let cache = Cache<NSData>("my-files") Haneke 同时包括一个零配置的图片缓存,可以自动缩放. 示例: imageView.hnk_setImageFromURL(url) 它的设计是超简单易用.这里是你如何初始化一个JSON缓存和从URL获取JSON对象: let cache = Cache&l

ASP.NET通用权限组件实现一

沙发(SF)通用权限验证组件 开篇 上一篇提到了通用权限的设计思路,根据设计思路一步一步的来实现一个相对通用的权限验证组件.在VS2010下用C#语言基于.net framework2.0框架实现具体功能. 配置文件 配置文件为XML格式(SFPermission.xml)公有四个节点分类: 一.AppSet节点:此节点配置一些基础信息. 1 <AppSet> 2 <!--数据库节点名称(必须在Web.config的connectionStrings节点下面)--> 3 <a

下载深入Java程序性能调优(阿姆达尔定律、缓存组件、并行开发、线程池、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1cvD3rw 密码:eevh 1.1. 性能概述--两个实战在线项目对比突出性能的重要性1.2. 性能概述--阿姆达尔定律解决性能的关键点2.1. 设计优化--模式在实际开发中运用012.2. 设计优化--模式在实际开发中运用02-延迟加载的核心2.3. 设计优化--模式在实际开发中运用03-基于动态代理的拦截器2

ReactJS实现的通用分页组件

大家多少都自己写过各种版本的分页工具条吧,像纯服务版的,纯jsWeb板的,Angular版的,因为这个基础得不能再基础的功能太多地方都会用到,下面我给出以个用ReactJS实现的版本,首先上图看下效果:    注意这个组件需要ES6环境,最好使用NodeJS结合Webpack来打包:webpack --display-error-details --config webpack.config.js 此React版分页组件请亲们结合redux来使用比较方便,UI = Fn(State)    基本

应用程序版本升级之通用更新组件

目的 很多做应用程序的朋友都做过为应用程序进行版本升级的功能,这个功能本身非常简单,但是各位有没有考虑过这个问题:假如我需要维护多个应用程序的时候(>2).每个应用程序的升级工作将变得很繁琐.我们需要有一套通用的更新机制,只需要为需要升级的应用程序进行简单的配置,就可以为之进行版本升级控制,而不需要单独给每个应用程序写升级的功能从而达到一劳永逸的目的. 组成 那么通用更新的组件应该如何来设计,它至少需要以下两个模块构成: 1.客户端模块    1.1 负责发送版本验证请求    1.2 负责下载

ASP.NET通用权限组件思路设计

开篇 做任何系统都离不开和绕不过权限的控制,尤其是B/S系统工作原理的特殊性使得权限控制起来更为繁琐,所以就在想是否可以利用IIS的工作原理,在IIS处理客户端请求的某个入口或出口通过判断URL来达到控制权限的目的,这样就可以减少通常要在每个页面或按钮都要添加的权限验证代码. 通常的权限验证模式 一般的权限验证会控制到菜单(页面)就可以满足,复杂一点的会要求控制到按钮(功能点),这个都需要做一下几点工作: 1.按权限生成菜单,这是所有系统都要做的: 2.在每个页面的开始处添加登录和权限的验证,调

写一个高效的缓存组件(对象池)

我们在写高效服务时,许多需要缓存,一般缓存组件都需要加锁,我最近想了一个方法,感觉还不错,分享一下.直接上代码: public abstract class SimpleObjPool<T> { int _locker = 0; int _cnt = 0; T[] _ts; public SimpleObjPool(int MaxSize) { _ts = new T[MaxSize]; } protected abstract T NewObj(); public T GetObj() {

微信自用高性能通用key-value组件MMKV已开源!

1.MMKV简介 腾讯微信团队于2018年9月底宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性.近期也已移植到 Android 平台,一并对外开源. MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证.近期也已移植到 An

注解及AOP实现Redis缓存组件

使用AOP以及注解实现缓存组件 1. 为什么使用AOP和注解实现缓存? 项目是一个报表系统,使用druid.io查询hue,每次查询巨大,可以达到每次30多M,而且后台也有很多运算,每次查询对服务器对压力很大,经常出现young gc,因此计划加入缓存提高查询效率,同时减少服务端的压力. 2. 为什么这么设计? 报表系统的一个基本逻辑:根据查询参数查询数据库,由于是离线的库,每天刷一遍数据,所以每次请求之间的区别仅仅是传递的参数,所以可以将缓存的位置直接放在controller层,根据传递的参数