从.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());
content = $"读到 {dt.ToLongTimeString()}";
}

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

具体效果如下图。

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

示例完整代码下载

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

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

    在前一篇烂文中,老周简单讲述了非Web应用的缓存技术的基本用法.其实嘛,使用系统默认方案已经满足我们的需求了,不过,如果你真想自己来配置缓存,也是可以的. 缓存的自定义配置可以有两种方案,一种是用代码 ...

  2. springboot 创建非web项目及数据源简单使用

    项目组马上要使用springboot来重构程序,首先要对几个比较小的非web项目重构,所以新手入门,简单做了个小例子 代码结构如下: dao层 package com.mysping.myboot00 ...

  3. SpringBootWEB项目和非Web项目的全局异常捕获

    一.简介 SpringBoot的WEB异常捕获,如果是WEB项目的话,可以直接处理Controller中的异常.如果不是WEB项目的话,就需要使用AspectJ来做切面. 二.WEB项目 packag ...

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

    [转]http://blog.csdn.net/tracy19880727/article/details/11205063 一般服务器运行的几乎都是web项目,今天遇到一个问题,把写好的Java项目 ...

  5. C#里面获取web和非web项目路径

    非Web程序获取路径几种方法如下: 1.AppDomain.CurrentDomain.BaseDirectory  2.Environment.CurrentDirectory 3.HttpRunt ...

  6. VS非web项目使用Transformation配置文件

    Web项目中的Transformation使用起来非常方便,特别是本地与服务器情况不一致时调试下以及webdeploy的配合使用. 步骤: 1. 在项目中新建App.Debug.Config及App. ...

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

    喜欢从业的专注,七分学习的态度. 概述 对于Java调试,使用Eclipse习惯性的使用Junit调试,使用Myeclipse习惯性的将项目转成Web项目在Tomcat或Weblogic中调试,在My ...

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

    简化 上个实例中,我们是引用了target文件来遍历项目中的xdt项. 当项目比较小,我们又只需要针对固定的config文件进行更替时,可以使用更简化的方法 不进行项目配置文件中的插入<Impo ...

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

    1.生成可执行jar 运行提示没有主清单属性 一番查找原因:是因为将项目生成jar包的时候,生成的MANIFEST.MF没有MAIN-CLASS,这里加上就可以了,后面的是项目启动类的完整类名 当然还 ...

随机推荐

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  3. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  4. iOS逆向工程之App脱壳

    本篇博客以微信为例,给微信脱壳."砸壳"在iOS逆向工程中是经常做的一件事情,,因为从AppStore直接下载安装的App是加壳的,其实就是经过加密的,这个“砸壳”的过程就是一个解 ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑

    原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...

  6. 微信小程序前端源码逻辑和工作流

    看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...

  7. 那些年【深入.NET平台和C#编程】

    一.深入.NET框架 1..NET框架具有两个组件:CLR(公共语言运行时)和FCL(框架类库),CLR是.NET框架的基础 2.框架核心类库: System.Collections.Generic: ...

  8. WebApi返回Json格式字符串

    WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...

  9. 记:MySQL 5.7.3.0 安装 全程截图

    前言: 下一个班快讲MySQL数据库了,正好把服务器里面的MySQL卸了重装了一下. 截个图,作为笔记.也正好留给需要的朋友们. 目录: 下载软件 运行安装程序 安装程序欢迎界面 许可协议 查找更新 ...

  10. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...