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

在前一篇烂文中,老周简单讲述了非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(0, 1000); //生成随机数
                // 写入缓存
                cache.Set("item", v, DateTimeOffset.Now.AddSeconds(5));
                label1.Text = v.ToString();
            }

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

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

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

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

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

示例程序下载地址

时间: 2024-10-13 23:40:26

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

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

从.net 4 开始,非web项目也可以使用缓存技术,故曰:.net 4 乃框架成熟之标志也. 对于缓存嘛,耍过 ASP.NET 的伙伴们肯定知道,这么说吧,就是将一些使用频率较高的数据放于内存中,并设置一个过期时间(比如30秒),只要缓存数据还没有过期,下一次在访问数据时就可以直接从缓存加载,而不需要重新读取.你想啊,如果数据是从数据库中读取的,或者通过网络从其他地方获得的,那么,采用缓存技术,就可以减少读取数据的次数,绿色环保. 当然了,要实时更新的内容就不能放到缓存中了,比如实时在线视频,

非web项目中使用XDT的实例

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

Tomcat的安装配置与web项目发布

Tomcat的安装配置与web项目发布 今日内容 1.Web开发基本概念(了解) 2.tomcat的安装和配置(必会) 3.web项目的发布(必会) 4.Http协议简介(理解) Web开发基本概念 1.软件的架构 常用的软件:QQ.京东.淘宝.kgc 1)C/S架构 解释:客户端/服务器. 特点:需要下载并安装,每次更新需要下载,客户端和服务器有可能都需要更新 控件炫酷,因为它调用的是系统底层的图形的API 2)B/S架构 解释:浏览器/服务器架构.它是基于Http协议的,用的是请求/响应模式

MyEclipse10+Flash Builder4+BlazeDS+Tomcat7配置J2EE Web项目报错(一)

1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 2014-6-23 20:15:55 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 using

spring配置与Web 项目启动

今天打算学习下spring继承quartz的用法,然后想搭建一个纯净的spring项目用来做相关的实验,虽然只是寥寥几行配置文件,但突然选择性失忆忘了这其中容器加载的过程和配置的意义.复习了下此刻写个随便记录下刚刚的领悟. web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc

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

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

(一)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

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

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

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

最近被同事一直吵着用Idea写Java,于是偷偷的去试用了一下Idea.确实不错,无论界面还是智能提醒都是蛮符合我的使用习惯,但是刚从Eclipse出来,使用Idea还是不太习惯的.所以这里写出来,供大家参考. 特别注意,我使用的是Idea 2016.3 版.因为Idea版本不一致差别还蛮大的. 下面开始进入正题. Maven下载和安装: 1.apache官网去下载maven, 2.解压到本地,然后配置环境变量(省略)PS:百度一大堆. 3.修改settings.xml,配置本地仓库: WEB配