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

缓存的自定义配置可以有两种方案,一种是用代码在应用程序中配置,即实例化MemoryCache对象时,可以向构造函数传递一个NameValueCollection实例,数据结构就是key-value形式,这些配置项的名字其实就是MemoryCacheElement类的以下三个属性:CacheMemoryLimitMegabytes、PhysicalMemoryLimitPercentage、PollingInterval。

老周不那么推荐上面的方案,倒是下面的方案较灵活。第二种方案就是使用配置文件(App.config),这种方法方便修改,而且不必动不动就重新编译。所以,本文就采取第二种方案。

自定义缓存配置需要指定名字,因为你可能会配置多个模式,每个模式都给一个命名,名字你可以随便用,但不要用Default,因为这个是系统默认保留的。

下面我们来配置一个名为cat的缓存设置。

<configuration>
<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name="cat" cacheMemoryLimitMegabytes="1" pollingInterval="00:01:00" physicalMemoryLimitPercentage="5"/>
</namedCaches>
</memoryCache>
</system.runtime.caching>
</configuration>

这个和配置数据库的连接字符串(connectionString)有点像,namedCaches下面每一个add子元素就是一个缓存配置项,必须用name来指定该项的名字,cacheMemoryLimitMegabytes用于限制缓存占用内存的大小,单位是MB,我这里配置为1 Mb。

physicalMemoryLimitPercentage则是限制缓存占用物理内存的百分比,值为0到100,包括0和100,如果为0,表示由系统自动调配,如果物理内存紧张,会清理缓存。

pollingInterval表示检查缓存限制的时间间隔,格式为00:00:00,即时-分-秒格式,我这里设置为1分钟。这个值不要设置得太频繁,要是设置为1秒钟就太吃性能了,没有这个必要,放宽到5分钟,10分钟也无妨,因为只是检查一下当前缓存占用的空间是否超出前面设定的两个限制值。比如每隔1分钟检查一下缓存大小是否超出物理内存的5%的容量。

如果想在配置前清除以前的配置,可以在add元素前加上clear元素;如果想删除某个已有的配置(可能在machine.config中有配置,一般不应该修改它,尤其是你不熟悉的情况下),可以在add元素前使用remove元素。与连接字符串的配置方法差不多。

配置完成后,就可以在代码中应用这些配置了。

在实例化MemoryCache时,向构造函数传递配置项的名字,比如我上面的示例,定义的配置名为cat。如果MemoryCache在配置文件中找不到指定名字的项,就会自动套用默认值。

请看示例代码:

            // 注意:
// 名称引用配置文件中定义的名字
// 如果找不到,就会填充默认值
cache = new MemoryCache("cat"); //实例化 // 输出调试信息
System.Diagnostics.Debug.WriteLine("MemoryCache 实例的属性:\n" +
$"{nameof(MemoryCache.Name)} = {cache.Name}\n" +
$"{nameof(MemoryCache.CacheMemoryLimit)} = {cache.CacheMemoryLimit / 1024 / 1024} Mb\n" +
$"{nameof(MemoryCache.PhysicalMemoryLimit)} = {cache.PhysicalMemoryLimit} %\n" +
$"{nameof(MemoryCache.PollingInterval)} = {cache.PollingInterval:t}");

如果你在配置文件中配置的项名为dog,这里你就把dog传递给MemoryCache的构造函数,我这里是cat。

我还用Debug类输出了调试信息,以便在调试运行时输出内容,从而验证配置文件中的缓存配置是否被正确使用。如下图。

这个输出表明,刚刚的配置已被正确使用了。

下面我们就可以往缓存里面读写数据了。

            if (cache.Contains("item"))
{
int v = Convert.ToInt32(cache["item"]); //读缓存
label1.Text = v.ToString();
}
else
{
int v = rand.Next(, ); //生成随机数
// 写入缓存
cache.Set("item", v, DateTimeOffset.Now.AddSeconds());
label1.Text = v.ToString();
}

这里我就把一个随机生成的整数值存入缓存,过期时间为5秒钟之后。

运行应用程序,只要在5秒钟内点击按钮,界面上显示的数字就不会变,因为5秒钟内,它读的是缓存中的内容。当超过5秒钟后再点击按钮,就会更新为新的值。

由于MemoryCache类实现了IDisposable接口,所以,当不再需要使用缓存时,应该调用Dispose方法释放相关资源。

            cache?.Dispose(); //释放资源
cache = null;

好了,本文的牛逼就吹到这里。

示例程序下载地址

【.net 深呼吸】自定义缓存配置(非Web项目)的更多相关文章

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

    从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并 ...

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

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

  3. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

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

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

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

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

  6. Eclipse配置maven web项目问题总结

    clipse创建Maven结构的web项目的时候选择Artifact Id为maven-artchetype-webapp,点击finish之后,一般会遇到如下问题 1. The superclass ...

  7. [转]Idea2016 使用Maven配置简单Web项目(受益比较多的一篇)

    最近被同事一直吵着用Idea写Java,于是偷偷的去试用了一下Idea.确实不错,无论界面还是智能提醒都是蛮符合我的使用习惯,但是刚从Eclipse出来,使用Idea还是不太习惯的.所以这里写出来,供 ...

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

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

  9. IDEA配置Java Web项目

    IDEA部署maven tomcat的java web项目的关键配置:

随机推荐

  1. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  2. MVC5+EF6+MYSQl,使用codeFirst的数据迁移

    之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...

  3. html与html5

    HTML 是一种在 Web 上使用的通用标记语言.HTML 允许你格式化文本,添加图片,创建链接.输入表单.框架和表格等等,并可将之存为文本文件,浏览器即可读取和显示.HTML 的关键是标签,其作用是 ...

  4. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  5. SQL Server-聚焦APPLY运算符(二十七)

    前言 其实有些新的特性在SQL Server早就已经出现过,但是若非系统的去学习数据库你会发现在实际项目中别人的SQL其实是比较复杂的,其实利用新的SQL Server语法会更加方便和简洁,从本节开始 ...

  6. 【开源】.Net Api开放接口文档网站

    开源地址:http://git.oschina.net/chejiangyi/ApiView 开源QQ群: .net 开源基础服务  238543768 ApiView .net api的接口文档查看 ...

  7. Flexible 弹性盒子模型之CSS flex-basis 属性

    实例 设置第二个弹性盒元素的初始长度为 80 像素: div:nth-of-type(2){flex-basis:80px;}   效果预览 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本 ...

  8. SQL 约束

    先用设计器创建约束.再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制见文件Employee.sql非空约束(选择复选框)主键约束(PK) primary key const ...

  9. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  10. Linux字符设备驱动框架

    字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l ...