【.net深呼吸】非 Web 项目使用缓存

从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也。

对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并设置一个过期时间(比如30秒),只要缓存数据还没有过期,下一次在访问数据时就可以直接从缓存加载,而不需要重新读取。你想啊,如果数据是从数据库中读取的,或者通过网络从其他地方获得的,那么,采用缓存技术,就可以减少读取数据的次数,绿色环保。

当然了,要实时更新的内容就不能放到缓存中了,比如实时在线视频,你就不能把视频数据放在缓存,不然就会变得太幽默了。

对于非web应用程序,在 System.Runtime.Caching 命名空间下面提供了一堆类型,支持缓存操作,缓存的数据是存放在内存中的,因此,框架提供了一个 MemoryCache 类,用来管理缓存,可存入缓存的数据类型为object,所以说,各种东东你都可以往里面塞。

在 99.995% 的情况下,你只需要访问该类的 Default 属性就能够获取一个 MemoryCache 实例,然后你直接用这个系统默认的缓存管理对象来写入和读取缓存数据了。

缓存的操作类似于字典,你得为缓存项安排一个 Key,这个 key 必须是唯一的,然后这个key会对应一个value,value的类型是object,所以你可以往里面放各种数据。例如从网络上获取的数据,文件的内容等。

要向缓存写入数据,老周大概介绍以下两种方案:

1、调用MemoryCache实例的Add方法,它需要两个参数,第一个参数是CacheItem对象,用起来很简单,实例化时设置key和value就行了,RegionName一般可以不管理它;第二个参数是CacheItemPolicy对象,它用来配置缓存项的参数,比如,AbsoluteExpiration属性设置该缓存项在啥时候过期,必要的时候,可以向ChangeMonitors属性添加一些监控器,例如监控文件变化等,假设你是把某个文件的内容放到缓存中,如果文件被修改了,那么该项缓存就会马上无效。还有要注意SlidingExpiration属性,它设置一个时间,如果缓存在这个时间内没有被访问,就会删除该项。它与AbsoluteExpiration不同,AbsoluteExpiration指定的是绝对的过期时间,不管缓存项有没有被访问,只要到期就会删除,而SlidingExpiration属性是指在这个时间后如果缓存项没有被访问,就会删除,两者不同。

2、调用MemoryCache实例的Set方法,该方法有两个重载,如果不需要详细的设置,可以指定key、value以及过期的时间即可,即调用以下重载:

void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null)

regionName默认为null,在MemoryCache类中不使用,所以不用管它。

要是你想对缓存项做更多设置,可以使用这个版本的重载:

void Set(string key, object value, CacheItemPolicy policy, string regionName = null)

记住:value不能设置为null,这样没有实际意义。你把null放到缓存中有个毛用。

如果想手动去删除某个缓存项,可以调用Remove方法,提供缓存项的key即可。

下面提供一个例子,请看代码:

        // 获取默认的 MemoryCache 实例
        MemoryCache cache = MemoryCache.Default;

        // 用于存储缓存项的键名
        const string CACHE_ITEM_NAME = "my_data";

               ……

            string content = string.Empty;
            // 首先判缓存项是否存在
            if (cache.Contains(CACHE_ITEM_NAME))
            {
                // 如果缓存项有效
                // 就从缓存中读取数据
                DateTime dt = (DateTime)cache[CACHE_ITEM_NAME];
                content = $"读到 {dt.ToLongTimeString()}";
            }
            else
            {
                // 如果缓存项不存在,或已过期
                // 则重新把当前时间写入缓存
                DateTime dt = DateTime.Now;
                cache.Set(CACHE_ITEM_NAME, dt, DateTimeOffset.Now.AddSeconds(20));
                content = $"读到 {dt.ToLongTimeString()}";
            }

这个例子也TMD简单,就是把当前的时间放进缓存里面,并指定过期时间为20秒之后。如果缓存没有过期,就从缓存里面读取时间值,如果缓存项过期了或者不存在,就重新把当前时间写入缓存。

具体效果如下图。

从上面截图中,你会看到,当缓存里的数据可用(20秒内进行读取),每次所读到的时间都是相同的。

示例完整代码下载

时间: 2024-10-01 03:28:10

【.net深呼吸】非 Web 项目使用缓存的相关文章

【.net 深呼吸】自定义缓存配置(非Web项目)

在前一篇烂文中,老周简单讲述了非Web应用的缓存技术的基本用法.其实嘛,使用系统默认方案已经满足我们的需求了,不过,如果你真想自己来配置缓存,也是可以的. 缓存的自定义配置可以有两种方案,一种是用代码在应用程序中配置,即实例化MemoryCache对象时,可以向构造函数传递一个NameValueCollection实例,数据结构就是key-value形式,这些配置项的名字其实就是MemoryCacheElement类的以下三个属性:CacheMemoryLimitMegabytes.Physic

非web项目中使用XDT的实例

概述 XDT是Asp.net 4.0中的一个新特性,可以让使用者在Web项目中在不同的生成类型下,快速切换配置文件(如在debug场景下使用测试配置数据库,在Release场景下使用正式配置数据库). 但在非web项目中,VS并未提供如此方便的功能.这时如果我们同样想使用xdt transforms的功能,就需要自己配置MSbuild文件. 在本例中我们是通过修改MSBuild配置文件,来使非web项目同样可以使用XDT功能. MSBuild全称(Microsoft Build Engine),

(一)JAVA项目(非web项目)部署到windows服务器运行

[转]http://blog.csdn.net/tracy19880727/article/details/11205063 一般服务器运行的几乎都是web项目,今天遇到一个问题,把写好的Java项目部署到windows服务器上运行, 如果没有依赖的jar包且只有一个包含main方法的java类,那么直接把java类放服务器上通过dos窗口执行(dos 窗口命令如下:cd 到该.class文件所在目录,然后执行java .class文件名),但是如果包含非JDK自带的第三方 jar包或者多个ja

Jfinal数据库操作在WebService或非web项目中的使用

接触上jfinal后就基本不使用其它框架了,一直在web开发中使用,最近做了个小的WebService应用,还是使用jfinal操作数据库,在这里分享下使用经验. 我的环境是三个oracle数据库,一个数据库接收数据,然后分发数据到另外两个数据库,使用jfinal的多数据源功能刚好满足要求. 编写数据库初始化类: 直接上代码 package ynitil.pekk.ws.common; import java.util.List; import ynitil.pekk.ws.model.Cltx

Myeclipse - Web项目转换技巧--处理Java项目、SVN非Web项目问题

喜欢从业的专注,七分学习的态度. 概述 对于Java调试,使用Eclipse习惯性的使用Junit调试,使用Myeclipse习惯性的将项目转成Web项目在Tomcat或Weblogic中调试,在Myeclipse项目对项目Web属性的理解有助于应对开发环境的配置.发布和部署,涉及的技巧和操作比较多.最常用最简单的技巧是将Java项目转Web项目技巧. 环境准备:创建一个Java项目 打开Myeclipse--右键--选择Project 创建1 点击Next(下一步) 创建-项目 点击Finis

eclipse部署非web项目到tomcat

从svn检出的项目,假如是非web项目.如何部署到tomcat? 1,确定tomcat设置是否正确: 双击图中tomcat: 确定设置如下: 2,项目上点击右键属性,勾选如图: 3,其实以上两步之后就可以了,如果还不能部署,那么: 修改workspace,项目/settings 中的 org.eclipse.wst.common.project.facet.core.xml文件<installed facet="jst.web" version="3.0"/&

非web项目中使用XDT的实例(续)

简化 上个实例中,我们是引用了target文件来遍历项目中的xdt项. 当项目比较小,我们又只需要针对固定的config文件进行更替时,可以使用更简化的方法 不进行项目配置文件中的插入<Import Project="$(MSBuildExtensionsPath)\Custom\TransformFiles.targets" /> 而直接写入代码 <UsingTask TaskName="TransformXml" AssemblyFile=&q

一次记录 java非web项目部署到linux

1.生成可执行jar 运行提示没有主清单属性 一番查找原因:是因为将项目生成jar包的时候,生成的MANIFEST.MF没有MAIN-CLASS,这里加上就可以了,后面的是项目启动类的完整类名 当然还可以在idea生成jar包时设置,File-Project Structure-Artifacts  ,如图所示: 然后按图所示进行操作,这里的第三步将路径改为src目录下,不要在main/java下 最后勾选这个:点击apply,OutPut directory 是生成jar包的路径 在idea主

非WEB项目中引入Hibernate Validator

前言: 网上一些朋友分享了关于hibernate-validator的使用方法,但是不是缺少关联库信息,就是提供的参考代码中缺少自定类. 希望我这一篇博客能够让你顺利的跑出预期的结果. 如果有错,可以给我留言. 英文好的朋友可以参考官网的getting started. http://hibernate.org/validator/documentation/getting-started/ 一.环境 hibernate-validator库必须运行的JDK版本为1.6及以上. 二.hibern